在Django模板中循环关联模型的子级

时间:2019-12-18 07:17:54

标签: django django-templates django-queryset single-table-inheritance django-related-manager

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

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传递到模板上下文,但是我想知道是否存在一种在模板中循环相关模型的子代的方法。
(请注意:遍历companypost的工作原理。但是我当然可以收到所有类型的帖子,例如postB等:

{% for post in company.companypost_set.all %}

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

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

1 个答案:

答案 0 :(得分:0)

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

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

我很确定是导致问题的原因是模型继承,并且隐约记得看到类似他的文献。我会回声,您真的需要在这里继承具体的模型吗?其他方法是使用CompanyPost个选择字段来创建更宽的post_type对象,如果不合适,其他字段为null或空白;或post_type字段,并且仅适用于该类型的数据存储为JSON字符串或JSONField(如果使用的是Postgresql)。