I found a way to express the second query in the ORM. Person.objects.filter(sex='F', pk__in=tallest_people) Thanks, Suriya
On Monday, June 1, 2015 at 12:13:49 PM UTC+5:30, Suriya Subramanian wrote: > > 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/43f9e3a1-4211-4bfa-aa8d-292cfe436169%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.

