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功能的正确方法。