Python Django视图检查第二个模型的值

Python Django视图检查第二个模型的值,python,django,Python,Django,我对Django有些陌生,所以请容忍我在这里。我的应用程序中有三个模型:公司、文章和成绩单。文章和成绩单都有一个链接到公司模型的foreignkey()字段。在我的主要观点中,我列出了所有的公司,但我想指出的是,这些公司是否都有文章或成绩单 以下是模型: class Company(models.Model): stock_symbol = models.CharField(max_length=5, unique=False) company_name = models.Cha

我对Django有些陌生,所以请容忍我在这里。我的应用程序中有三个模型:公司、文章和成绩单。文章和成绩单都有一个链接到公司模型的foreignkey()字段。在我的主要观点中,我列出了所有的公司,但我想指出的是,这些公司是否都有文章或成绩单

以下是模型:

class Company(models.Model):
    stock_symbol = models.CharField(max_length=5, unique=False)
    company_name = models.CharField(max_length=200)
    address = models.CharField(max_length=300, blank=True)
    website = models.URLField(max_length=200, blank=True)
    following = models.BooleanField()

class Articles(models.Model):
    company = models.ForeignKey('Company', related_name='articles')
    headline = models.CharField(max_length=200)
    url = models.URLField(max_length=300, blank=True)

class Transcripts(models.Model):
    company = models.ForeignKey('Company', related_name='transcripts')
    headline = models.CharField(max_length=200)
    url = models.URLField(max_length=300, blank=True)
下面是一个单一公司的视图,但由于我返回所有公司,显然不能使用primarykey。我将如何为每个公司获取这些信息?我设置模型的方法是否正确

class CompanyDetails(generic.DetailView):
    model = Company
    template_name = 'company_details.html'

    def get_context_data(self, **kwargs):
        pk = self.kwargs.get('pk')
        context = super(CompanyDetails, self).get_context_data(**kwargs)
        context['company'] = Company.objects.filter(id=pk)            
        context['articles'] = Articles.objects.filter(company_id=pk).order_by('-date')
        context['transcripts'] = Transcripts.objects.filter(company_id=pk).order_by('-date')
        return context
更新

如果我想在一列中显示每个公司至少有一篇文章,如何更新模板?当我在答案中尝试for循环时,它为每一篇文章都创建了一列,因此我尝试将其更改为下面的内容,但它显示为“空白”


{所有_公司中公司的百分比%}
{{company.stock_symbol}}
{%if company.following%}
{%else%}
{%endif%}
{%if company.articles.all%}
{%else%}
空白
{%endif%}
{{company.address}
{%endfor%}

在模板中,您可以按照外键从公司向后移动到其文章或成绩单

  {{ company }}
  {% for company in company.articles.all %}
    {{ article }}
  {% endfor %}
如果在详细信息视图中使用此选项,则不必在
get\u context\u data
方法中设置
文章
成绩单
。您根本不应该设置
context['company']
——详细信息视图为您完成了这项工作

在列表视图中,您可以循环浏览公司,并以相同的方式访问文章和成绩单

{% for company in company_list %}
  {{ company }}
  {% for company in company.articles.all %}
    {{ article }}
  {% endfor %}
{% endfor %}
这将导致查询集中每个公司的查询。您可以通过使用来防止这种情况

在列表视图中,通过设置
queryset
,可以使用
prefetch\u related

class CompanyList(generic.ListView):
    # No need to set model now that you have set queryset
    queryset = Company.objects.prefetch_related('articles', 'transcripts')
如果您只想知道是否存在关联的文章或事务,那么您不必预取它们。您可以改为使用查询集:

from django.db.models import Count

# in your view
queryset = Company.objects.annotate(num_articles=Count('article')
然后在模板中,您可以访问
company.num\u articles

{% if company.num_articles %}
  Company has articles
{% endif %}

这是有道理的,谢谢。然而,我不想显示每一篇文章,我只想显示一个图标,表明至少有一篇文章与该公司相关。我不知道如何使用嵌套的if语句退出for循环,而单个if语句不起作用。(上面用模板代码更新的问题)您可以使用if语句代替循环
{%if-article-company.articles.all%}…{%endif%}
。但是,如果您不需要显示文章,则更有效的方法是
对查询集进行注释。请参阅我的最新答案。
from django.db.models import Count

# in your view
queryset = Company.objects.annotate(num_articles=Count('article')
{% if company.num_articles %}
  Company has articles
{% endif %}