【问题标题】:Django: get related objects of related objects and pass to templateDjango:获取相关对象的相关对象并传递给模板
【发布时间】: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 进行分类。

【问题讨论】:

    标签: django orm model foreign-keys django-queryset


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2021-02-25
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 2020-04-14
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        相关资源
        最近更新 更多