django:自相关 ForeignKey 字段的相关名称不起作用 |在模板中获取相反方向的自引用

Posted

技术标签:

【中文标题】django:自相关 ForeignKey 字段的相关名称不起作用 |在模板中获取相反方向的自引用【英文标题】:django: related_name of self related ForeignKey field not working | get opposite direction of self reference in template 【发布时间】:2022-01-08 19:11:58 【问题描述】:

嘿嘿! :)

我有一个创建单一机构 (Institution) 的模型,并且可以通过 parent_institution (self) 将其连接到父机构。

所以我有机构 A,它是 b, c, d 的父级(它们都是具有自己详细视图的单个机构。)在详细视图中b我在“母机构”部分获得了 A,其中包括一个指向 A 详细视图的链接。 p>

<p><b>Parent institution: </b>
    % if institution.parent_institution %
    <a href="% url 'stakeholders:institution_detail' institution.parent_institution.id %">
        institution.parent_institution
    </a>
    % endif %
</p>

通过此链接,我可以看到 A 的详细视图,其中我想要一个包含儿童机构的部分。应该列出b、c、d

我给parent_institution添加了一个相关的名字

class Institution(models.Model):
    name = models.CharField(
        verbose_name=_("Name of the institution"),
        max_length=200,
    )
    parent_institution = models.ForeignKey(
        "self",
        verbose_name=_("Parent institution"),
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
        help_text=_("if applicable"),
        related_name="child",
    )

通常我可以通过这个 related_name 沿相反方向跟踪 ForeignKey。

<p><b>Child institution: </b>
        institution.child.name
</p>

但在这种情况下,这不起作用并给我“无”。为此我尝试了:

% if institution.id == institution.all.parent_institution.id %
      institution.name
% endif %
% if institution.all.id == institution.parent_institution.id %
     institution.name
% endif %
% for child in institutions.all %
% if child.id == institution.parent_institution.id %
institution.name
% endif %
% endfor %
# views.py

class InstitutionDetail(DetailView):
    model = Institution

    def get(self, request, *args, **kwargs):
        institutions_child = Institution.objects.filter(parent_institution__isnull=True).prefetch_related('parent_institution_set')
        institutions = get_object_or_404(Institution, pk=kwargs['pk'])

        context = 'institutions_child': institutions_child, 'institutions': institutions

        return render(request, 'stakeholders/institution_detail.html', context)
% for child_node in institutions.parent_institution_set.all %
    child_node.name
% endfor %

我得到 None 或当前机构名称 (A)。

有谁知道我如何才能实现将所有儿童机构都显示在详细视图中的目标?

感谢任何帮助! :)

【问题讨论】:

【参考方案1】:

相反方向的外键返回查询集,而不是模型实例。

<p><b>Child institution: </b></p>
<ul>
    % for child in institutions.child.all %
        <li> child.name </li>
    % endfor %
</ul>

【讨论】:

您知道如何在管理区域添加子字段吗?只是将“孩子”添加到字段/字段集中是行不通的。不过,这非常适合模板! :) @piah,在admin表单中只在外键方向起作用,因为它修改了数据库上的相关字段parent_institution_id

以上是关于django:自相关 ForeignKey 字段的相关名称不起作用 |在模板中获取相反方向的自引用的主要内容,如果未能解决你的问题,请参考以下文章

找不到与 Django ForeignKey 问题相关的类

尽管空白 = True 和 null = True,但需要 Django ForeignKey 字段

Django Admin ForeignKey字段小部件选项和不一致的默认值

两个相关模型的 Django 查询

Django ORM计数相关字段

按外键/相关字段分组 django 查询集