How can filter parent based on children in django

2019-06-17 07:00发布

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条回答
老娘就宠你
2楼-- · 2019-06-17 07:14
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)
查看更多
登录 后发表回答