繁体   English   中英

Django筛选符合ManyToMany中特定条件的行数

[英]Django filter by the number of rows matching a certain condition in a ManyToMany

我需要过滤在ManyToMany关系中的元素数量与条件匹配的对象。 以下是一些简化的模型:

Place(models.Model):
     name = models.CharField(max_length=100)
Person(models.Model):
     type = models.CharField(max_length=1)
     place = models.ManyToManyField(Place, related_name="people")

我试图这样做:

c = Count(Q(people__type='V'))
p = Places.objects.annotate(v_people=c)

但这只是使.v_people属性计算的是人数。

,您可以为此使用Count(..)函数[Django-doc]filter=...参数:

Place.objects.annotate(
    v_people=Count('people', filter=Q(people__type='V'))
)

因此,这将为v_people分配该特定Place对象的type='V'的人数。

另一种方法是先.filter(..)关系:

Place.objects.filter(
    Q(people__type='V') | Q(people__isnull=True)
).annotate(
    v_people=Count('people')
)

在这里,我们于是滤镜的关系,使得我们允许people要么有type='V' ,或者没有people在所有的(因为它是可能的Place没有people ,我们再算上相关的模型。

这将生成一个查询,例如:

SELECT `place`.*, COUNT(`person_place`.`person_id`) AS `v_people`
FROM `place`
LEFT OUTER JOIN `person_place` ON `place`.`id` = `person_place`.`place_id`
LEFT OUTER JOIN `person` ON `person_place`.`person_id` = `person`.`id`
WHERE `person`.`type` = V OR `person_place`.`person_id` IS NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM