我有一个公司的模型。 然后,我有一个用于公司职位的基本模型。它包含常见的帖子属性。属性是发布帖子的公司。它使用外键引用公司模型。 最后,我有一个子模型(基于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中,我解释了为什么我使用具体的模型继承,并询问什么是更好的解决方案。
答案 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)。