Django queryset如何排除没有组或标签的产品?

时间:2017-03-03 14:01:00

标签: python django python-3.x django-models

群组开始,我想返回queryset个项目,但如果该群组没有产品,则会从该群组中排除该群组分配给它的标签。

模型

class Group(models.Model):
    name = models.CharField(max_length=50)

class Tag(models.Model):
    name = models.CharField(max_length=50)
    group = models.ForeignKey('Group', related_name='tags')

class Product(models.Model):
    name = models.CharField(max_length=50)
    tags = models.ManyToManyField('Tag', related_name='products')

这就是我的尝试:

Group.objects.all().exclude(tags__products__isnull=True)

上面似乎没有返回正确的结果。如果我在群组Red200cm中有2个带有colorwidth代码的产品。一个产品的标签为红色,但另一个产品没有分配给一个组的标签,因此我希望返回一个组。上面的错误给我得到0?

另一个例子

Group 1 Color
Group 2 Width

Tag Red - FK to Group 1

Product 1 FK to tag Red

结果应该是只显示第1组,因为第2组没有带标签的产品。

2 个答案:

答案 0 :(得分:3)

如果Model Tag中有另一个'color',则可以解释您描述的行为。如果该标记没有产品,则Group会因为该标记而正确排除颜色组。你应该反过来接近它:

exclude

而不是

Group.objects.filter(tags__products__isnull=False)  
# one tag with a product suffices to include the group -> intended!

答案 1 :(得分:-1)

Group.objects.all().exclude(tags__products__name='')

Django文档: https://docs.djangoproject.com/en/dev/ref/models/fields/#null