在Django模板中循环相关模型的孩子

Posted

技术标签:

【中文标题】在Django模板中循环相关模型的孩子【英文标题】:Loop over related model's children in Django template 【发布时间】:2020-04-10 17:15:14 【问题描述】:

我有一个公司的模型。 然后我有一个公司职位的基本模型。它包含常见的帖子属性。属性是发布帖子的公司。它指的是带有 ForeignKey 的 Company 模型。 最后,我有一个用于 A 类型帖子的子模型(基于 CompanyPost 基础模型):

class Company(models.Model):
    name = models.CharField(...)
    ...


class CompanyPost(models.Model):
    company = models.ForeignKey(Company,...)
    ...


class PostA(CompanyPost):
    name = ...

在模板中,我想循环访问特定公司发布的 A 类帖子。 我尝试了这些变体:

1)

% for postA in company.companyposts_set.all.postA_set.all %
...

2)

% for companyposts in company.companypost_set.all %
% for postA in companyposts.postA_set.all %
...
% endfor %% endfor %

我尝试了上述的其他子变体。似乎没有一个工作。 我知道我可以轻松地在视图中准备集合,例如:

postsA = PostA.objects.filter(company__pk=pk)

并将 postsA 传递给模板上下文,但我想知道是否有办法在模板中循环相关模型的子项。 (注意:遍历 companyposts 是可行的。但我当然会收到所有类型的帖子,比如 postB 等:

% for post in company.companypost_set.all %

这就是为什么我尝试上面的变体 2) 再次循环遍历结果。) 提前谢谢你。

更新: 谢谢大家的答案。 我明白,通过选择模型继承,我选择了一个复杂的解决方案。 在本帖中,我询问是否可以在模板中显示相关模型的子项。为了不混淆问题,在this question 中我解释了为什么我使用具体的模型继承并询问什么是更好的解决方案。

【问题讨论】:

你的帖子真的需要模型继承吗? 话虽如此,company.posta_set.all() 这样的东西应该可以工作(未经测试,我的项目中没有任何具有具体继承的模型)。 我正在使用模型继承,因为我读到它会在未来提供更大的灵活性,因为否则很难循环包含来自具有不同属性/方法的不同模型的实例的集合/列表.循环父模型实例会更容易。但是,我在遍历父实例时遇到了更多困难,因为父实例无法“知道”子实例属于哪个子类(PostA 或 PostB)。 company.posta_set.all 不起作用(company.companypost_set.all 起作用,正如我所写)。 我的问题不清楚,抱歉。我的意思是:PostA 和 PostB 之间有什么区别,如果有,是否需要 concrete 继承? @brunodesthuilliers 是的,存在差异。但选择的实际原因是,与合并不同模型的实例相比,我可以更轻松地通过父级循环遍历所有帖子。在更新中,我放置了一个链接,指向具体继承的选择是否是最好的问题,因为这是一个不同的问题。 【参考方案1】:

如果您不想在视图中定义它,可以将其定义为Company 对象的属性。

@property
def post_a_set(self):
    return PostA.objects.filter(company__pk=self.pk)

我很确定是模型继承导致了问题,并且依稀记得看到过类似他记录的内容。我会回应,你真的需要具体的模型继承吗?其他方法是更广泛的CompanyPost 对象,带有post_type 选择字段,如果不合适,其他字段为空或空白;或 post_type 字段以及仅适用于该类型的数据,存储为 JSON 字符串或(如果您使用 Postgresql)JSONField。

【讨论】:

以上是关于在Django模板中循环相关模型的孩子的主要内容,如果未能解决你的问题,请参考以下文章

Django外键未在模板中呈现相关模型数据

Django模板按“不相关”模型的字段排序

Django在模板中的相关模型调用上“无法解析余数”

Django - 如何以有效的方式获取最新的相关模型,我可以在模板上进行迭代?

初始Django

Django:获取相关对象的相关对象并传递给模板