在Django模板中计算外键模型的正确方法

时间:2015-10-29 23:38:30

标签: python django

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,
    }

这样做的正确方法是什么?我相信这两种实现都非常糟糕且“很难”。

1 个答案:

答案 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 }}