Skip to main content
 首页 » 编程设计

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

2024年10月24日36落叶

class Author(models.Model): 
    name = models.CharField() 
 
class Article(models.Model): 
    author = models.ForeignKey(Author) 

假设我需要在模板中显示有多少 Articles 来自确定的作者。这是 View :

def myview(request): 
    context = { 
        'authors': Author.objects.all() 
    } 

只需执行 {{ author.Articles||length }} 就需要我编辑 Author 模型。如果这是正确的方法(显然不是),我应该在 models.py 级别还是在 View 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, 
    } 

这样做的正确方法是什么?我认为这两种实现都非常糟糕且“hacky”。​​

请您参考如下方法:

如果你已经有一个检索到的作者并且你想获得文章计数然后使用 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 }}。