我对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>
答案 0 :(得分:3)
在模板中,您可以将公钥从公司向后追溯到其文章或成绩单。
{{ company }}
{% for company in company.articles.all %}
{{ article }}
{% endfor %}
如果您在详情视图中使用此功能,则无需在articles
方法中设置transcripts
或get_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 %}