Chris Lawlor
Chris Lawlor

Reputation: 48902

Django queries: Count number of objects with FK to model instance

This should be easy but for some reason I'm having trouble finding it. I have the following:

App(models.Model):
    ...

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

How can I query for all App objects that have at least one Release?

I started typing:

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

Which won't work because Count doesn't span relationships, at least as far as I can tell.

BONUS:

Ultimately, I'd also like to be able to sort Apps by latest release date. I'm thinking of caching the latest release date in the app to make this a little easier (and cheaper), and updating it in the Release model's save method, unless of course there is a better way.

Edit:

I'm using Django 1.1 - not averse to migrating to dev in anticipation of 1.2 if there is a compelling reason though.

Upvotes: 3

Views: 660

Answers (2)

Ben James
Ben James

Reputation: 125137

You should be able to use:

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

Upvotes: 4

Dmitry Shevchenko
Dmitry Shevchenko

Reputation: 32404

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

For the bonus part, denormalizing date field looks like the only solution at the moment. And it's pretty fast too.

Upvotes: 2

Related Questions