如何从用户在 django 基本模板中创建的所有帖子中获取模型字段值的总和?

Posted

技术标签:

【中文标题】如何从用户在 django 基本模板中创建的所有帖子中获取模型字段值的总和?【英文标题】:How to get the sum of a model field value from all the posts a user created in django base template? 【发布时间】:2020-10-25 14:05:04 【问题描述】:

我有一个auth_user 模型和一个posts 模型。 posts 模型具有如下字段:idauthor_idlikes。我只需要在base 模板中打印与每个user 相关的likes 值。喜欢:

user.posts.likes

user.user_id.posts.likes

这是我的帖子模型:

class Post(models.Model):
    title = models.CharField(max_length=150)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    likes = models.PositiveIntegerField(default=0, blank=True)
    
    class Meta:
        db_table = "posts"
    
    def total_likes(self):
        return self.likes

但是它不起作用,而 user.profile.image.url (配置文件是另一个具有user_id 的模型)完美地工作。 我正在将base 模板导入到其他模板,例如% extends "app/base.html" %,所以我看不到后端有任何地方可以传递likes

【问题讨论】:

请添加您的模型 @ArakkalAbu 我添加了posts的型号???? 【参考方案1】:

我认为问题在于您将单个 Post 与多个 posts 混淆了,因此没有可访问的对象。用户只有一个配置文件,但正如您的代码所示,他们可以拥有多个 posts,正如 author ForeignKey 所指示的那样。

 user.post_set  <- is a manager
 user.post_set.all  <- is a queryset
 user.post_set.all.0  <- is the first item of the queryset 
 user.post_set.all.0.likes  <- should be the # of likes of the user's first post

编辑 1

更新后的问题可以重述为“我如何才能获得用户通过他们的帖子收到的总赞数”

可能有一种方法可以在模板中实现这一点,但我认为这会很困难。我会将这个数字放在视图代码中。您正在寻找的关键词是“聚合”

https://docs.djangoproject.com/en/3.1/topics/db/aggregation/

from django.db.models import Sum
...
# inside your view
total_likes = user.post_set.all().aggregate(Sum('likes'))

编辑 2

完全正确@melvyn

编辑 3

为了在不修改视图的情况下将其应用于所有页面,您必须编写上下文处理器。

https://docs.djangoproject.com/en/3.1/ref/templates/api/#writing-your-own-context-processors

file: likes_context.py
from django.db.models import Sum

def likes_context_processor(request):
    if request.user.is_authenticated:
        posts = request.user.post_set.all()
        total_likes = posts.aggregate(Sum('likes'))
    else:
        total_likes = 0
    return "total_likes": total_likes 

您需要适当地找到该文件,然后将其添加到 settings.py 中的上下文处理器配置中

这也可能有帮助:creating my own context processor in django

【讨论】:

嗨迈克,谢谢你的回答,我试过 user.posts.all.0.likes user.posts.all.0.title user.posts.all.0 user.posts.all ,但没有一个返回任何结果。只需 user 返回username 的值 我刚刚尝试使用 posts.0.likes ,它根据我传递给views.py中每个模板的第一个查询集帖子返回喜欢的数量。例如在第一个模板 11、第二个 0、第三个 200 等等......你知道我怎么能期望总结用户创建的所有喜欢的帖子?我尝试了 user.posts.all.likes |length ,但没有成功! Pssst:没有related_name,所以user.posts应该是user.post_set @Mike 感谢您的更新。由于我在 base.html 的标头中使用喜欢,所以我没有将 post.queryset 直接传递给基本模板,所以我想我无法在 view.py 中处理它。你知道如何在模板中解决它吗? @Mike 你的回答太棒了。它工作正常,正如我预期的那样,当我尝试注销时只会发生一个错误。正如'AnonymousUser' object has no attribute 'post_set' 发生在posts = request.user.post_set.all() 行中,我试图跳过它,但即使关闭服务器,所有代码也会变得疯狂,这很奇怪!

以上是关于如何从用户在 django 基本模板中创建的所有帖子中获取模型字段值的总和?的主要内容,如果未能解决你的问题,请参考以下文章

在 django-page-CMS 中创建的视图会禁用所有 CSS?包含代码,请修复

Django Annotate - 我可以将在 annotate 中创建的字段用于在 annotate 中创建的另一个字段吗?

如何使用 CBV 在我的所有 Django 模板中创建侧边栏?

如何在django创建模板中创建对象时自动插入当前用户?

Django具体操作

如何在 ARM 模板中引用在 Azure 门户中创建的现有存储账户?