Django获取外键对象列表

Sni*_*r03 3 django django-models django-rest-framework

我有这样的模型:

class A:
....


class B:
....
a = model.ForeignKey(A, related_name='a')
....
Run Code Online (Sandbox Code Playgroud)

假设有一个 B 对象。我可以得到这样的对象:

b = B()
a = b.a
Run Code Online (Sandbox Code Playgroud)

那么获取与A相关的所有B对象的最简单方法是什么?

另外,我可以获得 A 的列表。

list_a = A.objects.filter()
Run Code Online (Sandbox Code Playgroud)

那么获取与list_a中的A对象相关的B列表的最简单方法是什么?

还有一个相反的情况:我有一个 B 列表:

list_b = B.objects.filter()

那么,获取list_b中与B对象相关的A对象的列表的最简单且优化的方法是什么呢?

ali*_*iva 5

B.objects.filter(a__in=a_list)
Run Code Online (Sandbox Code Playgroud)

请注意,您可以像这样过滤相关对象(相反,如果执行两个查询,则将其合并为一个)

例如,如果您的 a_list 是这样的查询:

a_list = A.objects.filter(field=2)
Run Code Online (Sandbox Code Playgroud)

你可以像这样过滤B:

B.objects.filter(a__field=2)
Run Code Online (Sandbox Code Playgroud)

这更具可读性,django 也可以优化它)

更新:您可以用同样的方式查询反向关系

A.objects.filter(b__in=b_list)
A.objects.filter(b__field=2)
Run Code Online (Sandbox Code Playgroud)

请注意,最好将代码更改为

a = model.ForeignKey(A, related_name='b')
Run Code Online (Sandbox Code Playgroud)

b是尊敬关系中字段的名称,因此an_a_instance.b.all()返回b指向给定的所有实例a_instance