2010-03-18 5 views
3

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

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) 

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

БОНУС:

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

Edit:

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

ответ

4

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

App.objects.annotate(release_count=Count('release')).filter(release_count__gt=0)\ 
    .order_by('-release__date') 
+0

Да, это именно то, что я собирался делать, но я был настолько уверен, что это не сработает, что я никогда не пробовал это в интерпретаторе. –

2
App.objects \ 
    .annotate(release_count=Count('release')) \ 
    .(release_count__gt=0) \ 
    .order_by('-release_count') 

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

+0

Это довольно просто заказать по дате выпуска без денормализации. См. Мой ответ. –

+0

глупый, ты прав. –

Смежные вопросы