class Author(models.Model):
name = models.CharField()
class Article(models.Model):
author = models.ForeignKey(Author)
让我们假设我需要在模板中显示有多少Articles
来自确定的作者。这是观点:
def myview(request):
context = {
'authors': Author.objects.all()
}
只需执行{{ author.Articles||length }}
就需要我编辑作者模型。如果这是正确的方法(显然不是这样),我应该在models.py
级别还是在myview
视图中执行此操作?
我认为在models.py
中编辑模型会导致代码设计非常糟糕。
在myview
中这样做会要求我做这样的事情:
authors = []
for author in authors:
count = Article.objects.filter(author__exact=author).count()
authors.append(author, count)
horrendously_bad_code_design_context = {
'authors': authors,
}
这样做的正确方法是什么?我相信这两种实现都非常糟糕且“很难”。
答案 0 :(得分:1)
如果您已有检索到的作者,并且想要获得文章计数,那么使用related manager's count
方法(author.article_set.count()
)可能没问题。
另一方面,如果你为了得到计数而迭代一个(可能是滞后的)Author
查询集,它会做很多查询(一个用于检索所有作者,一个用于每个作者以获得计数) )。这可以很容易地被只会导致一个查询的annotated queryset替换:
from django.db.models import Count
Author.objects.annotate(article_count=Count('articles'))
稍后在您的模板中,您可以使用{{ author.article_count }}
。