[英]How can I filter models data based on the foreign key in Django views?
我有两个模型,分别是User和UserRating,它们之间是一对多的关系,如何过滤特定用户的评分,以便可以计算出其总体评分并将其显示在个人资料中。 谢谢。
#this is model for user
class User(models.Model):
username = models.CharField(max_length=128, unique=True)
email = models.EmailField(max_length=128, unique=True)
#password = forms.CharField(max_length=32, widget=forms.PasswordInput)
profilepic = models.ImageField(null=True)
firstname = models.CharField(max_length=128, null=True)
secondname = models.CharField(max_length=128, null=True)
city = models.ForeignKey(City)
#this is the model for user ratings - one to many relationship with User
class UserRating(models.Model):
user = models.ForeignKey(User)
comment = models.CharField(max_length=500)
rating = models.IntegerField(default=5)
如果您有一个User
对象,则可以通过反向关系访问其所有评分:
user.userrating_set.all()
要计算他的平均评分,请使用Aggregation
from django.db.models import Avg
user.userrating_set.all().aggregate(Avg('rating'))
如果要将其作为用户模型的属性,请执行以下操作:
class User(models.Model):
username = models.CharField(max_length=128, unique=True)
...
@property
def avg_rating(self):
return self.userrating_set.all().aggregate(Avg('rating'))
然后您可以使用
user.avg_rating
编辑 -已更新,因此您可以除以评分数
在视图中...
from django.db.models import Sum
current_user_rating_object = UserRating.objects.filter(user=request.user)
ratings = current_user_rating_objects.count()
total_rating = current_user_rating_object.aggregate(Sum(total_rating=Sum('rating', distinct=True))['total_rating']
weighted_rating = total_rating / ratings
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.