Python Django模型-搜索“;“向后”;带和'的外键;d Q';s

Python Django模型-搜索“;“向后”;带和'的外键;d Q';s,python,django,Python,Django,我有一些模型是这样布置的(有很多字段): 我有一个使用Q对象的搜索系统0和1是主键,由一个ModelMultipleChiceField以一种形式获得,它们的foos都指向相同的a 所以对于逻辑,我可以用这个 >>> A.objects.filter(Q(b__pk=0) | Q(b__pk=1)) [<A: A object>, <A: A object>] 但是,我还想做和逻辑。理想情况下,它可以通过使用&而不是来工作,但这不起作用 >>

我有一些模型是这样布置的(有很多字段):

我有一个使用
Q
对象的搜索系统
0
1
是主键,由一个
ModelMultipleChiceField
以一种形式获得,它们的
foo
s都指向相同的
a

所以对于逻辑,我可以用这个

>>> A.objects.filter(Q(b__pk=0) | Q(b__pk=1))
[<A: A object>, <A: A object>]
但是,我还想做
逻辑。理想情况下,它可以通过使用
&
而不是
来工作,但这不起作用

>>> A.objects.filter(Q(b__pk=0) & Q(b__pk=1))
[]

那么,最简单的方法是什么呢?

在调查我的问题时,我提出的最佳解决方案是:

match_keys = [0,1]
matches = [s for s in A.objects.all() if len(s.b_set.filter(pk__in=match_keys)) == len(match_keys)]

但是,我想知道是否有更好的方法可以做到这一点,即只使用
Q
对象,从而在ORM中完成所有工作。

我猜您希望一个实例至少有一个B()w/主键1和一个B()w/主键0

那你需要

(A.objects.filter(b__pk=0) & A.objects.filter(b__pk=1)).distinct()
如果连接受伤,请执行以下操作

A.objects.filter(
    models.Q(pk__in=B.objects.filter(pk=0).values('foo_id')) &
    models.Q(pk__in=B.objects.filter(pk=1).values('foo_id')))
如果您需要一个只有两个相对B()的()函数,一个是w/pk=0,另一个是pk=1,则应通过以下方式对上述查询集应用限制:

queryset.annotate(b_count=models.Count('b')).filter(b_count=2)

我不知道queryset的
\uuu和
进行了连接。美好的我会看看你的解决方案是否有效…是的,非常有效。我使用了第二个,因为我更喜欢使用Q对象,因为我使用
query=reduce(Q.\uuu和\uuuu,查询)
A.objects.filter(
    models.Q(pk__in=B.objects.filter(pk=0).values('foo_id')) &
    models.Q(pk__in=B.objects.filter(pk=1).values('foo_id')))
queryset.annotate(b_count=models.Count('b')).filter(b_count=2)