0

我有一个公司的模型。然后我有一个公司职位的基本模型。它包含常见的帖子属性。属性是发布帖子的公司。它指的是带有 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)再次循环结果。)
提前谢谢你。

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

4

1 回答 1

0

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

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

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

于 2019-12-18T14:27:33.557 回答