Django使用特定于每个对象的限制来过滤ManyToMany计数上的模型?

时间:2018-06-03 20:13:57

标签: django django-models django-queryset

Django filter the model on ManyToMany count?

我的问题与上面的问题非常类似,但区别在于:模型内部的多对多关系存在限制。

所以不是

class Party(models.Model):
    organiser = models.ForeignKey()
    participants = models.ManyToManyField('auth.User', 
        related_name="participants")

这将是

class Party(models.Model):
    organiser = models.ForeignKey()
    max_participants = models.PositiveIntegerField()
    participants = models.ManyToManyField('auth.User', 
        related_name="participants")

所以我想找到参与者数量少于Party.max_participants的所有Party对象。如何使用Django的ORM进行查询?

1 个答案:

答案 0 :(得分:2)

首先我们使用参与者数量对每个Party对象进行注释,然后我们执行.filter(..),其中max_participants大于(__gt),然后是参与者数量:< / p>

from django.db.models import Count, F

Party.objects.annotate(
    num_participants=Count('participants')
).filter(
    max_participants__gt=F('num_participants')
)

因此这里使用F(..)-expression来引用我们定义的num_participants注释,因此我们添加max_participants列大于该数字的约束。