如何从用户在 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
模型具有如下字段:id
、author_id
和 likes
。我只需要在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 中创建的另一个字段吗?