Запросы Django: подсчитать количество объектов с FK до экземпляра модели - PullRequest
3 голосов
/ 18 марта 2010

Это должно быть легко, но по какой-то причине у меня возникают проблемы с его поиском. У меня есть следующее:

App(models.Model):
    ...

Release(models.Model):
    date = models.DateTimeField()
    App = models.ForeignKey(App)
    ...

Как я могу запросить все объекты приложения, имеющие хотя бы одну версию?

Я начал печатать:

App.objects.all().annotate(release_count=Count('??????')).filter(release_count__gt=0)

Что не сработает, потому что граф не охватывает отношения, по крайней мере, насколько я могу судить.

БОНУС:

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

Edit:

Я использую Django 1.1 - не против перехода на dev в ожидании 1.2, хотя есть веская причина.

Ответы [ 2 ]

4 голосов
/ 18 марта 2010

Вы должны быть в состоянии использовать:

App.objects.annotate(release_count=Count('release')).filter(release_count__gt=0)\
    .order_by('-release__date')
2 голосов
/ 18 марта 2010
App.objects \
    .annotate(release_count=Count('release')) \
    .(release_count__gt=0) \
    .order_by('-release_count')

Для бонусной части поле даты денормализации выглядит как единственное решение на данный момент. И это тоже довольно быстро.

...