Django Как аннотировать количество вложенных для словаря oop queryset - PullRequest
0 голосов
/ 08 апреля 2020

Добрый день,

Моя проблема:

Мой проект в зависимости от начисления баллов пользователям, которые делают какие-либо действия, такие как (публикация, комментарии, избранное, лайки). .....).

Итак, на странице списка пользователей я хочу перечислить всех пользователей и другие данные для каждого пользователя (имя, очки, значки, ....)

до дать пользователям баллы, которые я должен считать его сообщения, комментарии, лайки и т. д. .....

я пробовал несколько методов и способов, но все не удалось получить аннотацию или 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)

, когда я печатаю вложенные .. я нашел количество каждого сообщения пользователя .. но как я могу сделать его в качестве переменной для повторного использования в вычисляемом поле

QuerySet

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_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' нет атрибута 'annotate'

любые предложения, пожалуйста ...

Заранее спасибо,

1 Ответ

1 голос
/ 08 апреля 2020

Вы пробовали это,

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(<b>posts_count=Count('posts'), posts_score=F('posts_count') * 1000</b>)
...