Django 如何注释嵌套 forloop 查询集字典的计数
Django how to annotate count nested forloop queryset dictionary
美好的一天,
我的问题是:
我的项目取决于对做出任何操作的用户给予积分,例如(post、评论、收藏、喜欢......)。
因此,在用户列表页面中,我想列出所有用户和每个用户的其他数据(姓名、积分、徽章......)
为了给用户积分,我必须计算他的post、评论、喜欢等等.....
我尝试了几种方法和方式,但都无法获得注释或prefetch_related或select_related
Models.py
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
Views.py
def user_list(request):
users = User.objects.all()
template = 'user/users_list.html'
nested_posts = {}
for user in users:
posts = user.posts.all()
nested_posts[user, posts] = posts.count()
print("nested : ", nested_posts)
context = {
'users': users,
'user':user,
'posts': posts,
'nested_posts': nested_posts,}
return render(request, template, context)
当我打印 nested .. 我发现每个用户的计数 posts .. 但是我怎样才能在计算字段 re-use 中将其作为变量
查询集
nested : {(<User: Fareed>, <QuerySet [<Post: Senior Purchasing Specialist>]>): 1,
(<User: Hussein>, <QuerySet [<Post: Senior Software Development Engineer in Test>]>): 1,
(<User: Karima>, <QuerySet []>): 0,
(<User: Yahia>, <QuerySet []>): 0}
我也试过了:
GetUserID = User.objects.get(id=2)
var01 = GetUserID.posts.all().count()
但这是针对一个用户 (id=2) .. 并且确保所有用户都获得了用户 (id=2) 的总 posts,而不是每个用户。
我也试过了:
Posts_count_per_user = User.posts.annotate(posts_count=Count('posts'))
User_Score_of_posts = Posts_count_per_user.aggregate(posts_score=Count('posts_count') * 1000)
但是我得到了这个错误:
'ReverseManyToOneDescriptor' object has no attribute 'annotate'
有什么建议请...
提前致谢,
你试过这个吗,
user_qs = User.objects.annotate(posts_count=Count('posts'))
# usage
for user_instance in user_qs:
print("post count: ", user_instance.posts_count)
print("post score: ", user_instance.posts_count * 1000)
或者您可以在数据库级别本身注释 post 分数,
from django.db.models import F, Count
user_qs = User.objects.annotate(<b>posts_count=Count('posts'), posts_score=F('posts_count') * 1000</b>)
美好的一天,
我的问题是:
我的项目取决于对做出任何操作的用户给予积分,例如(post、评论、收藏、喜欢......)。
因此,在用户列表页面中,我想列出所有用户和每个用户的其他数据(姓名、积分、徽章......)
为了给用户积分,我必须计算他的post、评论、喜欢等等.....
我尝试了几种方法和方式,但都无法获得注释或prefetch_related或select_related
Models.py
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
Views.py
def user_list(request):
users = User.objects.all()
template = 'user/users_list.html'
nested_posts = {}
for user in users:
posts = user.posts.all()
nested_posts[user, posts] = posts.count()
print("nested : ", nested_posts)
context = {
'users': users,
'user':user,
'posts': posts,
'nested_posts': nested_posts,}
return render(request, template, context)
当我打印 nested .. 我发现每个用户的计数 posts .. 但是我怎样才能在计算字段 re-use 中将其作为变量
查询集
nested : {(<User: Fareed>, <QuerySet [<Post: Senior Purchasing Specialist>]>): 1,
(<User: Hussein>, <QuerySet [<Post: Senior Software Development Engineer in Test>]>): 1,
(<User: Karima>, <QuerySet []>): 0,
(<User: Yahia>, <QuerySet []>): 0}
我也试过了:
GetUserID = User.objects.get(id=2)
var01 = GetUserID.posts.all().count()
但这是针对一个用户 (id=2) .. 并且确保所有用户都获得了用户 (id=2) 的总 posts,而不是每个用户。
我也试过了:
Posts_count_per_user = User.posts.annotate(posts_count=Count('posts'))
User_Score_of_posts = Posts_count_per_user.aggregate(posts_score=Count('posts_count') * 1000)
但是我得到了这个错误:
'ReverseManyToOneDescriptor' object has no attribute 'annotate'
有什么建议请...
提前致谢,
你试过这个吗,
user_qs = User.objects.annotate(posts_count=Count('posts'))
# usage
for user_instance in user_qs:
print("post count: ", user_instance.posts_count)
print("post score: ", user_instance.posts_count * 1000)
或者您可以在数据库级别本身注释 post 分数,
from django.db.models import F, Count
user_qs = User.objects.annotate(<b>posts_count=Count('posts'), posts_score=F('posts_count') * 1000</b>)