假设有两个模型:
A:
pass
B:
a = foreign_key(A)
现在,我有一个查询集
bs = B.objects.filter(...)
我想获取所有bs
中引用了a
的,也就是在bs
中被引用的每个b
所对应的a
。
有什么方法可以做到吗?我认为在 SQL 中,一个简单的 join 就可以实现,不知道 Django 是否支持这样做。
假设有两个模型:
A:
pass
B:
a = foreign_key(A)
现在,我有一个查询集
bs = B.objects.filter(...)
我想获取所有bs
中引用了a
的,也就是在bs
中被引用的每个b
所对应的a
。
有什么方法可以做到吗?我认为在 SQL 中,一个简单的 join 就可以实现,不知道 Django 是否支持这样做。
你可以使用__in
:
A.objects.filter(b__in=bs)
或者你可以完全避免创建bs queryset,并直接在查询中跟随关系:
A.objects.filter(b__<bcondition>=<bvalue>)
例如,如果用于创建bs
的筛选器如下:bs = B.objects.filter(name="Banana")
然后您可以使用以下方法过滤A
对象:
A.objects.filter(b__name="Banana")
请记住,您可以使用多种不同的过滤方式,并且过滤功能非常广泛,因此值得查看过滤文档
__in
可能会返回重复记录。A.objects.filter(b__in=bs).count()
可能大于 A.objects.all().count()
对我来说,使用distinct()
像this SO答案中所提到的一样有效。
A.objects.filter(b__in=bs).distinct()
bcondition
和bvalue
是什么意思。 - DarkFranXbs
的任何表达式。 - Daniel Roseman