python - Django - 在带注释的查询中访问外键数据

标签 python django

我正在使用django-relationships我正在按关注者数量过滤我的用户,如下所示:

Relationship.objects.values('to_user').annotate(num_followers=Count('to_user')).order_by('-num_followers')

返回类似这样的内容

[{'to_user': 1, 'num_followers': 3}, {'to_user': 4, 'num_followers': 1}]

我的问题是我需要访问我的 User 对象,而不仅仅是他们的 pk。现在我正在做这样的事情:

tu_list = []
for tu in top_users_set:
    tu_list.append({
        'top_user': User.objects.get(pk=tu['to_user']),
        'followers': tu['num_followers'],
    })

它正在为每个用户进行查询。由于查询集最终可能有数百个以上的用户,这可能非常糟糕。

任何有助于改进这一点的意见将不胜感激。

谢谢

最佳答案

如果您想要用户,您需要通过查询用户模型并加入关系来以相反的方式访问它。这是相关的documentation

应该是这样的:

from django.db.models import Count

users = User.objects.annotate(num_followers=Count('to_users')).order_by('-num_followers')

这将为您提供用户,并且每个用户都将拥有一个额外的属性num_followers

model.py

from django.contrib.auth.models import User
from django.db import models

class Relationship(models.Model):
    from_user = models.ForeignKey(User, related_name='from_users')
    to_user = models.ForeignKey(User, related_name='to_users')

测试

>>> from so.models import *
>>> from django.contrib.auth.models import User
>>> u1 = User()
>>> u1.username='user1'
>>> u1.save()
>>> u2 = User()
>>> u2.username='user2'
>>> u2.save()
>>> u3=User()
>>> u3.username='user3'
>>> u3.save()
>>> # so we have 3 users now
>>> r1 = Relationship()
>>> r1.from_user=u1
>>> r1.to_user=u2
>>> r1.save()
>>> r2=Relationship()
>>> r2.from_user=u1
>>> r2.to_user=u3
>>> r2.save()
>>> r3=Relationship()
>>> r3.from_user=u2
>>> r3.to_user=u3
>>> r3.save()
>>> rels = Relationship.objects.all()
>>> rels.count()
3
>>> # we have 3 relationships: user1 follows user2, user1 follows user3, user2 follows user3
>>> users = User.objects.annotate(num_followers=Count('to_users')).order_by('-num_followers')
>>> for user in users:
>>>     print user.username, user.num_followers
user3 2
user2 1
user1 0

EDIT2修复了拼写错误,添加了测试

关于python - Django - 在带注释的查询中访问外键数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11140628/

相关文章:

python - Celery 与 ProcessPoolExecutor/ThreadPoolExecutor

python - 让 Python 打印一天中的小时数

python - 嵌套列表 : Count, 最大值和最小值

python - 如何强制清理字段并在 Django 中重新显示它?

python - 正则表达式性能Python

python - 填充嵌套字典

django - 模板不存在 : 500. html

python - django excel xlwt

python - 在 Django 的 Queryset 中过滤 django-taggit 的标签

python - 设置 Django 翻译的正确方法是什么?