Python Django查询集,带排除和;注释不返回任何结果

Python Django查询集,带排除和;注释不返回任何结果,python,django,django-queryset,django-orm,Python,Django,Django Queryset,Django Orm,基于这一点,我有一个问题。这是我的模型: class Type(models.Model): is_bulk = models.BooleanField() class Component(models.Model): parent = models.ForgeinKey(Type, related_name="components") 我想编写一个包含所有类型的queryset,除了那些具有is_bulk=True且没有组件的类型。如果is_bulk=False,则应将其包括在内。

基于这一点,我有一个问题。这是我的模型:

class Type(models.Model):
  is_bulk = models.BooleanField()

class Component(models.Model):
  parent = models.ForgeinKey(Type, related_name="components")
我想编写一个包含所有类型的queryset,除了那些具有is_bulk=True且没有组件的类型。如果is_bulk=False,则应将其包括在内。如果是_bulk=True,并且您有1+个链接组件,那么您将被包括在内。否则,你将被排除在外

根据答案,我尝试了以下查询集:

Type.objects.annotate(num_components=Count('components')).exclude(is_bulk=True, num_components=0)
Type.objects.annotate(num_components=Count('components')).exclude(is_bulk=True, num_components=0)
但它没有返回任何结果

然而,这意味着应该有结果:

>>> [(x.is_bulk, x.num_components) for x in Type.objects.annotate(num_components=Count('components'))]
[(False, 0), (False, 0), (False, 0), (False, 0), (False, 0), (False, 0), (False, 0)]
所有类型对象都有is_bulk=False,并且它们都有0个组件。从读取结果来看,它应该是
而不是(is_bulk=True和num_components=0)
,这对于每种类型都应该是真的。对吗?(我在这里是否有误解,如果有,正确的查询集是什么)


如果不是,为什么此查询集返回
[]
,而它应该返回所有查询集?这是Django 1.3中的一个bug吗?

我尝试了这个示例,您需要的是在您的字段中声明一个
相关的\u名称

class Component(models.Model):
    parent = models.ForgeinKey(Type, related_name='components')
那应该可以

更新

根据您的示例:

>>> [(x.is_bulk, x.num_components) for x in Type.objects.annotate(num_components=Count('components'))]
[(False, 0), (False, 0), (False, 0), (False, 0), (False, 0), (False, 0), (False, 0)]
和我的:

>>> [(x.is_bulk, x.num_components) for x in Type.objects.annotate(num_components=Count('components'))]
[(False, 3), (False, 0), (False, 1), (False, 4), (True, 2), (True, 3), (True, 1), (True, 1), (False, 2), (True, 7), (True, 0), (False, 0)]
我假设您没有满足queryset要求的对象:

Type.objects.annotate(num_components=Count('components')).exclude(is_bulk=True, num_components=0)
Type.objects.annotate(num_components=Count('components')).exclude(is_bulk=True, num_components=0)
您的结果:

[]
以下是我的案例的结果:

[<Type: Type object>, <Type: Type object>, <Type: Type object>, <Type: Type object>]
[,]

我通过将查询集更改为:

types_qs.annotate(num_components=Count('components')).filter(Q(is_bulk=False) | (Q(is_bulk=True) & Q(num_components__gt=0)))

这是可行的,但我不明白为什么我原来的一个没有。好吧。

您可能希望打印查询集的查询属性,以便读取SQL Django输出。您可以一次使用一个参数尝试排除,以查看问题是
is_bulk=True
num_components=0
还是将它们一起使用。您的模型中有一个输入错误。py
parent=models.forginkey(Type)
应该是foreignkey我已经在我的模型中这样做了,问题出现了。我已经更新了问题