Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 每个用户的Django计数关系_Sql_Django_Django Models - Fatal编程技术网

Sql 每个用户的Django计数关系

Sql 每个用户的Django计数关系,sql,django,django-models,Sql,Django,Django Models,如何计算每个用户有多少“朋友”,然后按降序显示 class Friend(models.Model): to_friend = models.ForeignKey(User) from_friend = models.ForeignKey(User, related_name='owner') 我有一个计算人际关系的想法,但我认为这不是一个有效的方法 for user in User.objects.all(): user.friend_set.all().count(

如何计算每个用户有多少“朋友”,然后按降序显示

class Friend(models.Model):
    to_friend = models.ForeignKey(User)
    from_friend = models.ForeignKey(User, related_name='owner')
我有一个计算人际关系的想法,但我认为这不是一个有效的方法

for user in User.objects.all():
    user.friend_set.all().count()

这是一种有效的方法,因为您不能有重复的关系(如果有,您可以使用distinct),count将返回关系的数量。 要按降序排列,可以执行以下操作:

query.order_by('-id_user')

坦率地说,我在这里有很多疑问

除了质疑
模型
体系结构之外,我还建议您一种优雅的方法

User.objects.prefetch\u相关('friend\u set')

您可以在

现在,这里有一个问题。上述查询可能返回重复的
朋友
。解决方法是
预取

from django.db.models import Prefetch
query = Prefetch('friend_set', Friend.objects.distinct())
User.objects.prefetch_related(query)
实际上,这将为您预取
用户的所有唯一
朋友

现在,关于
独特朋友的
计数
,我认为这样就可以了-

from django.db.models import Count
User.objects.prefetch_related(query).annotate(number_of_friends=Count('friend'))

你可以阅读更多关于
annotate

的内容,我想你对
从朋友
到朋友
的关系有点难。你能解释一下这种造型吗?为什么不使用多对多关系呢?因为我希望用户之间的每个关系都有对象。但我不确定这是实现friends功能的正确方法。