Джанго ОРМ, агрегация? - PullRequest
       11

Джанго ОРМ, агрегация?

0 голосов
/ 19 ноября 2009

Не уверен, как сформулировать вопрос, но здесь идет.

Скажем, у меня есть таблица событий, и каждое событие связывается с объектом, используя общий внешний ключ.

Я не хочу показывать два события, которые связаны с одним и тем же внешним объектом, только самое последнее событие из тех, которые ссылаются на один и тот же объект.

Кто-нибудь может дать какие-нибудь подсказки?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2009

Я думаю, что может быть очень трудно сделать то, что вы просите. Поскольку вы ищете список событий и используете общие отношения, ваша единственная ставка, вероятно, заключается в добавлении некоторого SQL через фильтр .extra (). Я не уверен, что даже знаю, какой SQL вам понадобится для этого, так как для этого, вероятно, потребуются предложения GROUP BY и HAVING.

В качестве альтернативы рассмотрите возможность добавления BooleanField к вашему объекту события с именем latest. Затем в методе сохранения вашего события напишите такой код:

def save(self, *args, **kwargs):
    similar_events = Event.objects.filter(content_type=self.content_type,
                                          object_id=self.object_id)
    later_events = similar_events.filter(date__gt=self.date)
    if later_events:
        self.latest = False
    else:
        self.latest = True
        similar_events.filter(date__lte=self.date).update(latest=False)

    super(Event, self).save(*args, **kwargs)

Затем, чтобы получить список событий, просто сделайте это:

Event.objects.filter(latest=True)
0 голосов
/ 19 ноября 2009

Когда вы используете внешние ключи для указания на модель, указанная модель получает дескриптор, ссылающийся на все модели, которые указывают на нее. По умолчанию это modelname_set или event_set в этом случае, если вы не изменили его.

Вы можете использовать этот дескриптор, чтобы получить самое последнее событие для объекта. Поскольку дескриптор возвращает набор запросов, вы можете упорядочить его по полю даты и взять первое.

  latest_event_for_obj = obj.entry_set.order_by('-your_date_field')[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...