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】:

假设您有一个名为 aA 实例。

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:获取相关对象的相关对象并传递给模板的主要内容,如果未能解决你的问题,请参考以下文章

Django之模板语法

Django Web开发之模板

模板中的 Django 字典:从另一个对象属性中获取键

第五篇:Django的模板层

Django将对象列表传递给模板

将对象从模板传递给 django 视图(控制器)