Django:获取每个用户的平均评分



给定以下内容,我如何进行查询以返回friendlist中每个用户的平均评分列表?

models.py

class Beer(models.Model):
id = models.BigIntegerField(primary_key=True)
name = models.CharField(max_length=150)
...
class Checkin(models.Model):
id = models.IntegerField(primary_key=True)
rating = models.FloatField(blank=True, null=True)
user = models.ForeignKey(User, on_delete=CASCADE)
...
class FriendList(models.Model):
user = models.OneToOneField(User, on_delete=CASCADE, primary_key=True)
friend = models.ManyToManyField(User, related_name="friends")

数据库(postgresql)

<表类>用户啤酒评级tbody><<tr>114.2113.5114.0214.1213.7

.annotate(…)[Django-doc]User对象,所以:

from django.db.models importAvg
friends.friend.filter(
checkin__beer_id=1
).annotate(
rating=Avg('checkin__rating')
)

,checkin__related_query_name=…[Django-doc]userCheckinUser模型。如果您没有指定related_query_name=…,那么它将使用related_name=…的值。[Django-doc],如果没有指定,它将使用模型的小写名称,因此checkin.

从这个查询集产生的User对象将有一个额外的属性.rating,该属性包含该beer_id平均值rating除以Checkins。

您可以使用.aggregate(…)确定这些平均值的平均值。叫<一口>[Django-doc]:

from django.db.models importAvg
friends.friend.filter(
checkin__beer_id=1
).annotate(
rating=Avg('checkin__rating')
).aggregate(
all_users_avg_rating=Avg('rating'),
number_of_users=Count('pk')
)

这将返回一个包含两个元素的字典:all_users_avg_rating将映射到这些平均值的平均值,number_of_users将返回不同用户的数量。


注意:通常最好使用settings.AUTH_USER_MODEL[Django-doc]引用用户模型,而不是使用Usermodel[Django-doc]有关更多信息,您可以查看文档中引用的User模型部分。

最新更新