给定以下内容,我如何进行查询以返回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)
.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]为user
从Checkin
到User
模型。如果您没有指定related_query_name=…
,那么它将使用related_name=…
的值。[Django-doc],如果没有指定,它将使用源模型的小写名称,因此checkin
.
从这个查询集产生的User
对象将有一个额外的属性.rating
,该属性包含该beer_id
的平均值rating
除以Checkin
s。
您可以使用.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]引用用户模型,而不是使用User
model[Django-doc]有关更多信息,您可以查看文档中引用的User
模型部分。