I have a question about how order_by(), distinct(), and filter() interact. This question is applicable only to the PostgreSQL backend since the Queryset is constructed by passing filed arguments to distinct(). https://docs.djangoproject.com/en/1.8/ref/models/querysets/#distinct In the other backends, distinct() accepts no arguments.
I'll illustrate my question with an example model. Here's a link to the code snippet: https://gist.github.com/anonymous/4111b718dbef264fb339 from django.db import models class Person(models.Model): SEX_CHOICES = ( ('M', 'Male'), ('F', 'Female'), ) name = models.CharField(max_length=255) sex = models.CharField(max_length=255, choices=SEX_CHOICES) city = models.CharField(max_length=255) height = models.DecimalField(max_digits=10, decimal_places=2) def __unicode__(self): return self.name I am interested in queries about the tallest person in a city. Specifically, 1) the tallest female in each city, and 2) the tallest person in cities where a female is the tallest. I am able to write the first query using the ORM, but not the second query. import django django.setup() from testapp.models import Person # Get a list consisting of the tallest female in each city. tallest_females = Person.objects.filter(sex='F').order_by('city', '-height').distinct('city').values_list('pk', flat=True) print tallest_females.query # This outputs: # # SELECT DISTINCT ON ("testapp_person"."city") "testapp_person"."id" # FROM "testapp_person" # WHERE "testapp_person"."sex" = F # ORDER BY "testapp_person"."city" ASC, "testapp_person"."height" DESC # Get a list consiting of females who are the tallest (among all people) in # their respective cities. # How do I get this list using the ORM? Note that I am having resort to # filtering results in Python. tallest_people = Person.objects.order_by('city', '-height').distinct('city').values_list('pk', flat=True) females_who_are_tallest_in_their_city = [ p for p in tallest_people if (p in tallest_females) ] # Ideally, I'd like to write: # Person.objects.order_by('city', '-height').distinct('city').filter(sex='F').values_list('pk', flat=True) What's a way to compute the results of the second query fully in the database, without resorting to Python code? Thanks, Suriya -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/844b90e2-d312-48b9-8239-150ae821d3e3%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.

