How can filter parent based on children in django

2019-06-17 06:50发布

问题:

I have this

from django.db import models

class Kid(models.Model):
    name = models.CharField(max_length=200)

class Toy(models.Model):
    name = models.CharField(max_length=200)
    owner = models.ForeignKey(Kid)

I have this queryset

kids = Kid.objects.all()

Now i want to filter kids whole toys has name star in it

and i am not able to decide which filter to apply

kids.filter(toys_set__icontains='star')

回答1:

Kid.objects.distinct().filter(toy__name__icontains='star')

Note the distinct() method. It is required because kid can have several "star" toys so without distinct() you will get duplicates in the queryset.

If you want to filter kids by number of found toys when use aggregation:

Kid.objects.distinct().filter(toy__name__icontains='star') \
                      .annotate(toys_num=Count('toy')).filter(toys_num__gt=4)