【问题标题】:Django how to annotate count nested forloop queryset dictionaryDjango如何注释计数嵌套的forloop查询集字典
【发布时间】:2020-07-20 08:39:58
【问题描述】:

美好的一天,

我的问题是:

我的项目取决于给做出任何操作(例如发布、评论、收藏、点赞......)的用户打分。

因此,在用户列表页面中,我想列出每个用户的所有用户和其他数据(姓名、积分、徽章……)

为了给用户积分,我必须计算他的帖子、cmets、喜欢等等.....

我尝试了几种方法和方法,但都无法获得 annotate 或 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 :  {(<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) 的用户.. 并且确保所有用户都获得了 user(id=2) 的帖子总数,而不是每个用户。

我也试过了:

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”对象没有“注释”属性

有什么建议请...

提前致谢,

【问题讨论】:

    标签: django for-loop view annotations aggregate


    【解决方案1】:

    你试过了吗,

    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)
    

    或者您可以在数据库级别本身中注释帖子分数,

    from django.db.models import F, Count
    
    user_qs = User.objects.annotate(posts_count=Count('posts'), posts_score=F('posts_count') * 1000)

    【讨论】:

    • 两者都像魅力一样工作..非常感谢您的支持
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2011-06-19
    • 2021-09-24
    • 1970-01-01
    相关资源
    最近更新 更多