Django - Как получить только 2 объекта для комбинации полей с набором запросов - PullRequest
2 голосов
/ 22 августа 2009

Если у меня есть

Model.objects.all()

Я хочу получить только один объект для любого content_object = foo, object_id = N. Как я могу это сделать? Скажи, что я заказываю по времени. Если я могу получить только один объект в наборе запросов для любого content_type = foo, object_id = N ... это должно быть самое последнее .. Как указать, что я хочу только 1 объект для любой комбинации content_object и object_id?

class CheckIn(models.Model):
    ...
    owner = models.ForeignKey('auth.User')
    datetime = models.DateTimeField(editable=False, auto_now=True)

    ...
    # This is the object that should be geocoded, hopefully
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

    class Meta:
        ordering=( '-datetime', )

Затем взять набор запросов:

checkins = CheckIn.objects.filter(
        datetime__gte=datetime.datetime.now() -
        datetime.timedelta(hours=24),
)

это может дать мне все проверки за последние 24 часа, но мне нужен только 1 объект PER content_type = foo и object_id = N.

1 Ответ

3 голосов
/ 22 августа 2009

Хотите ли вы найти последнюю модель объект после некоторой фильтрации? Что вы подразумеваете под идентификатором объекта? Это внешний ключ? Или это идентификатор модели, автоматически сгенерированный django? Я думаю, что это позже. В этом случае вы можете использовать только id . Это может помочь вам (я предполагаю, что у вас есть по крайней мере эти поля в вашей модели: content_object, dateField):

Model.objects.filter(content_object=foo,id=N).order_by(dateField)[0]

EDIT:

Я прошу прощения. Ну, вопрос не был этот ясным в начале (и я я новичок). Вот наивный подход (думаю, вы хотите отчетливый ):

d={}
[d.setdefault(str(a.content_type)+str(a.object_id),a) for a in checkins ]
d.values() # this gives your desired list of distinct objects
...