Django-存在许多查询的查询过滤器

时间:2019-06-03 21:31:10

标签: django django-models django-queryset

我有这样一个模型:

class News(models.Model):
    # ...
    channels = models.ManyToManyField(Channel)
    # ...

获取与频道有关的新闻的最有效方法是什么?

2 个答案:

答案 0 :(得分:2)

对于给定的频道,您可以使用:

News.object.filter(channels=my_channel)

对于一个集合(列表,QuerySet,...):

News.object.filter(channels__in=my_channel_collection)

对于具有至少一个(或更多)通道的News对象,我们可以使用以下查询:

News.objects.filter(channels__isnull=False).distinct()

或使用.exclude(..)

News.objects.exclude(channels=None)

答案 1 :(得分:0)

这比看起来要复杂。我有一个Step m2m字段的模型ingredients。只有603是正确的:)

>>> Step.objects.count()
735
>>> Step.objects.filter(ingredients=True).count()
159
>>> Step.objects.exclude(ingredients=False).count()
735
>>> Step.objects.exclude(ingredients=None).count()
603
>>> Step.objects.filter(ingredients__isnull=False).distinct().count()
603
>>> Step.objects.filter(ingredients__isnull=False).count()
59310
>>> sum([step.ingredients.exists() for step in Step.objects.all()])
603