Django:获取相关对象的相关对象并传递给模板
Posted
技术标签:
【中文标题】Django:获取相关对象的相关对象并传递给模板【英文标题】:Django: get related objects of related objects and pass to template 【发布时间】:2018-03-29 10:28:05 【问题描述】:在 Django 应用程序中,我有三个模型:
class A(models.Model):
aId = models.AutoField(primary_key=True)
class B(models.Model):
bId = models.AutoField(primary_key=True)
aId = models.ForeignKey(A)
class C(models.Model):
cId = models.AutoField(primary_key=True)
bId = models.ForeignKey(B)
A 和 B 之间存在一对多关系,就像 B 和 C 之间存在一样。
还有一个带有context_data
的视图类。在模板中,我需要显示和过滤 B,以及它们的 C。
如何将与 A 相关的所有 B 和与这些 B 相关的所有 C 传递到我的模板(上下文)?
我试图在两个数组中分别获取 Bs 和 Cs,但这似乎不是一个好主意,因为我无法按 Bs 对 Cs 进行分类。
【问题讨论】:
【参考方案1】:假设您有一个名为 a
的 A
实例。
bs = a.b_set.all()
for b in bs:
cs = b.c_set.all()
元素的迭代可能在模板本身中完成。
为了避免多次查询,您可以prefetch related objects。
【讨论】:
【参考方案2】:所以这将是您视图的代码。我不确定 args/kwargs 中给出了哪些对象。
from django.views.generic import TemplateView
class YourView(TemplateView):
template_name = 'yourtemplate.html'
def get_context_data(self, **kwargs):
a = kwargs.get('a')
b = kwargs.get('b')
ctx = super().get_context_data(**kwargs)
ctx['all b related to a'] = a.b_set.all()
ctx['all c related to b'] = b.c_set.all()
return ctx
如果您必须组合查询集,如@s_puria 建议的那样,为每个 b 说多个 cs 查询集,您可以使用 UNION 运算符 https://docs.djangoproject.com/en/1.11/ref/models/querysets/#union
【讨论】:
以上是关于Django:获取相关对象的相关对象并传递给模板的主要内容,如果未能解决你的问题,请参考以下文章