【问题标题】:How can I filter models data based on the foreign key in Django views?如何根据 Django 视图中的外键过滤模型数据?
【发布时间】:2016-06-10 03:30:18
【问题描述】:

我有两个模型,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)

【问题讨论】:

    标签: python django filter models


    【解决方案1】:

    如果您有User 对象,您可以通过reverse relationship 访问他的所有评分:

    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
    

    【讨论】:

    • 您可以将其创建为 User 模型上的属性。
    【解决方案2】:

    编辑 - 已更新,因此您可以除以评分数

    在视图中...

    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
    

    【讨论】:

    • 谢谢。但是,我如何将该值除以总评分以获得平均值。
    • 已在上面编辑...这可能更紧凑,但希望您能看到每个部分的工作原理。
    • 使用 Avg 而不是 sum(见我的回答)
    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 2015-04-13
    • 2021-06-06
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多