Thanks, never heard of Subqueries before! It's time to upgrade to Django
1.11 I guess.
Performance-wise, do you know if it's any different than running over my
Adult objects and for each one of them running a separate query looking for
their oldest son & daughter? Or is it the same and it just looks better?
Thanks again.
On Sunday, 21 May 2017 17:53:25 UTC+3, Simon Charette wrote:
>
> Hello Yo'av,
>
> You'll want to use subqueries for this[0].
>
> from django.db.models import OuterRef, Subquery
>
> children =
> Child.objects.filter(adult=OuterRef('pk')).order_by('dob').values('dob')
>
> Adult.objects.annotate(
> oldest_son_dob=Subquery(children.filter(gender='M')[:1]),
> oldest_daughter_dob=Subquery(children.filter(gender='F')[:1]),
> )
>
> Note that I haven't tried the above code myself so it might required
> adjustments.
>
> Cheers,
> Simon
>
> [0]
> https://docs.djangoproject.com/en/1.11/ref/models/expressions/#subquery-expressions
>
> Le dimanche 21 mai 2017 10:41:44 UTC-4, Yo'av Moshe a écrit :
>>
>> Hey Djangoists!
>> I can't get my head around this and I'm not sure if it's even possible.
>>
>> Let's say I have an "Adult" object and a "Child" object. Every Child
>> belongs to an Adult, and has a gender which is either "M" or "F", and also
>> a "dob" field with their date of birth. I want to get a list of all adults
>> annotated with the dob of their oldest son, and the dob of their oldest
>> daughter.
>>
>> How am I to do this?
>>
>> I tried something like this:
>> Adult.objects.annotate(
>> oldest_son_dob=Case(
>> When(children__gender="M", then=F('children__dob')),
>> default=None,
>> output_field=DateField(),
>> )
>> )
>>
>> # ... same for daughter
>>
>>
>> but I'm not sure where to tell Django that I only want it to pick the
>> oldest child, and so right now it duplicates the adult object for every
>> child it has.
>>
>> Does Django support this kind of query?
>>
>> I'm using PosgresSQL FWIW.
>>
>> Thank you so much
>>
>> Yo'av
>>
>
--
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 https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/b3a4222d-622b-4399-a704-8d9961d23c36%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.