Django View检查第二个模型的值

时间:2017-05-02 15:56:45

标签: python django

我对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)

下面是一家公司的视图,但是由于我要归还所有公司,我显然不能使用主键。我如何获得每个公司的这些信息?我是否以正确的方式设置我的模型?

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循环时,它为每篇文章创建了一个列,所以我尝试将其更改为下面但是每个记录都显示为“空白”。

    <tbody>
        {% for company in all_companies %}
        <tr>
            <td nowrap="true"><a href="{% url 'company_details' pk=company.pk %}">{{ company.company_name }}</a></td>
            <td nowrap="true">{{ company.stock_symbol }}</td>
            {% if company.following %}
                <td align="center"><span class="glyphicon glyphicon-star"></span></td>
            {% else %}
                <td></td>
            {% endif %}

            <!--HAS ARTICLE(S) FLAG -->
            {% if article in company.articles.all %}
                <td align="center"><span class="glyphicon glyphicon-list-alt"></span></td>
            {% else %}
                <td>Blank</td>
            {% endif %}

            <td nowrap="true"><a href="{{ company.website }}" target="_blank">{{ company.website }}</a></td>
            <td nowrap="true">{{ company.address }}</td>
        </tr>
        {% endfor %}
    </tbody>

1 个答案:

答案 0 :(得分:3)

在模板中,您可以将公钥从公司向后追溯到其文章或成绩单。

  {{ company }}
  {% for company in company.articles.all %}
    {{ article }}
  {% endfor %}

如果您在详情视图中使用此功能,则无需在articles方法中设置transcriptsget_context_data。您根本不应设置context['company'] - 详细视图会为您执行此操作。

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

{% for company in company_list %}
  {{ company }}
  {% for company in company.articles.all %}
    {{ article }}
  {% endfor %}
{% endfor %}

这将导致查询集中的每个公司的查询。您可以使用prefetch_related来阻止此操作。

Company.objects.prefetch_related('articles', 'transcripts')

在列表视图中,您可以通过设置prefetch_related

queryset
class CompanyList(generic.ListView):
    # No need to set model now that you have set queryset
    queryset = Company.objects.prefetch_related('articles', 'transcripts')

如果您只想知道是否有关联的文章或交易,那么您不必预取它们。您可以改为annotate查询集:

from django.db.models import Count

# in your view
queryset = Company.objects.annotate(num_articles=Count('article')

然后在您的模板中,您可以访问company.num_articles

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