【问题标题】:Django getting foreign-key object listDjango获取外键对象列表
【发布时间】:2018-12-01 18:33:49
【问题描述】:

我有这样的模型:

class A:
....


class B:
....
a = model.ForeignKey(A, related_name='a')
....

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

b = B()
a = b.a

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

此外, 我可以得到一个 A 的列表。

list_a = A.objects.filter()

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

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

list_b = B.objects.filter()

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

【问题讨论】:

标签: django django-models django-rest-framework


【解决方案1】:
B.objects.filter(a__in=a_list)

请注意,您可以像这样过滤相关对象(而不是如果同时执行两个查询)

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

a_list = A.objects.filter(field=2)

你可以像这样过滤 B:

B.objects.filter(a__field=2)

可读性更强,django也可以优化)

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

A.objects.filter(b__in=b_list)
A.objects.filter(b__field=2)

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

a = model.ForeignKey(A, related_name='b')

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

【讨论】:

  • 谢谢@aliva 的快速回答。那么反过来的情况如何:list_b=B.objects.filter() 怎样才能得到与B相关的A对象列表呢?
  • 我试过了,但我收到了这个错误:“无法将关键字 'b' 解析到字段中。”因为一个对象没有一个名为'b'的字段
  • 抱歉,这是基于我关于将 related_name 更改为 'b' 的注释,
  • B 对象有 A 对象作为外键。所以你的代码应该是 b=model.ForeignKey(A,related_name='b') 对吧?那么 A.objects.filter(b__in=b_list) 会起作用吗?
  • 我认为您应该查看此链接以了解 django 相关关系如何工作docs.djangoproject.com/en/2.0/topics/db/queries/…
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2013-01-20
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多