Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中实现分级_Python_Django - Fatal编程技术网

Python 在django中实现分级

Python 在django中实现分级,python,django,Python,Django,在模型中实现速率场的更好方法是什么。现在我有一个: class Story(models.Model): ... rate = models.(help here) class Rating(models.Model): rate = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(10.0)]) story = models.ForeignKey(Story, on

在模型中实现速率场的更好方法是什么。现在我有一个:

class Story(models.Model):
    ...
    rate = models.(help here)

class Rating(models.Model):
    rate = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(10.0)])
    story = models.ForeignKey(Story, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

还是有别的办法

您应该使用如下所示的直通字段:

class Story(models.Model):
    rates = models.ManyToManyField(User, through=Rating)

class Rating(models.Model):
    rate = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(10.0)])
    story = models.ForeignKey(Story, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
story.rating_set.all()
或者,您可以使用单独的模型来执行此操作,在这种情况下,您可以从<代码>故事<代码>模型中删除<代码>费率<代码>字段,或者从<代码>评级<代码>模型中删除<代码>故事<代码>字段:

class Story(models.Model):
    ...
    # rate = models.(help here) No need anymore

class Rating(models.Model):
    rate = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(10.0)])
    story = models.ForeignKey(Story, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
您的查询集将如下所示:

class Story(models.Model):
    rates = models.ManyToManyField(User, through=Rating)

class Rating(models.Model):
    rate = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(10.0)])
    story = models.ForeignKey(Story, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
story.rating_set.all()

这将包括所选故事实例的所有评级。

正如@Liudvikas Bajarunas所说,在
评级
模型中将
故事
定义为外键就足够了。您可以使用
rating\u set
访问故事分级:

story\u ratings=story.rating\u set.all()
有关更多信息,请参阅

您可以将该方法与以下方法相结合,以获得故事的平均评分:

课堂故事(models.Model):
...
@财产
def平均_额定值(自身):
返回self.rating\u set.all().aggregate(平均('rate'))['rate\u平均']

您可以做一些改进:

  • 通常情况下,最好使用引用用户模型,因为您以后可以改变对它的看法
  • 您可能希望使
    用户
    故事
    一起唯一,这样用户就不能对同一故事进行两次评分
  • 一些数据库,如PostgreSQL,允许我们在数据库级别强制执行范围约束,从而使其更加安全
  • 因此,我们可以将其改写为:

    from django.db import models
    from django.contrib.auth import get_user_model
    from django.db.models import CheckConstraint, Q, UniqueConstraint
    
    class Rating(models.Model):
        rate = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(10.0)])
        story = models.ForeignKey(Story, on_delete=models.CASCADE)
        user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    
        class Meta:
            constraints = [
                CheckConstraint(check=Q(rate__range=(0, 10)), name='valid_rate'),
                UniqueConstraint(fields=['user', 'story'], name='rating_once')
            ]
    来自django.db导入模型的
    
    从django.contrib.auth导入get\u user\u模型
    从django.db.models导入CheckConstraint、Q、UniqueConstraint
    等级评定(型号.型号):
    速率=models.FloatField(验证器=[MinValueValidator(0.0),MaxValueValidator(10.0)])
    story=models.ForeignKey(story,on_delete=models.CASCADE)
    user=models.ForeignKey(在_delete=models.CASCADE上获取_user_model())
    类元:
    约束=[
    CheckConstraint(check=Q(速率范围=(0,10)),name='valid\u rate',
    UniqueConstraint(字段=['user','story'],name='rating_once')
    
    ]
    它将是一个数字吗?这是一个带逗号的数字吗?@LiudvikasBajarunas似乎是一个浮点数,但我不知道该放什么(foreignkey、float或某种关系)哦,你已经在评级模型中创建了评级。所以,将它作为一个连接到评级模型的外键可能就足够了。如果你做一个连接Story.rate到评级模型,我认为你不需要在Rating.Story中使用另一个外键。你只需要一个外键,这就足够回答一个简单的连接附加问题了,你走一条路还是另一条路重要吗?我发现自己经常选择第二个,因为它可以更好地控制相关的名称(因为如果您想在使用直通模型时获得实际的评级值,则必须通过
    story.rating\u set.all()
    ,这(如果我没有错的话)自动访问它),不能像ForeignKey定义
    相关的\u名称那样更改。一般来说,不,这不重要。但在某些情况下,是的,基于架构设计和项目要求。我想是的。谢谢!我做的是StorySerializer包含与另一个AuthorSerializer相关的author字段。因此它提供了用户详细信息。或者使用get_user_model是最佳做法?@DanabekDuisekov:
    get_user_model()
    将在此处返回
    user
    ,如果您没有在
    settings.py
    中更改用户模型。不过,最好使用
    get_user_model()
    超过
    用户
    ,因为如果以后更改该模型,它将引用新模型。检查=Q(速率范围=(0,10)和验证器=[MinValueValidator(0.0),MaxValueValidator(10.0)]做同样的事情,不是吗?如果是的话,哪一个更可取,另一个可以删除?@DanabekDuisekov:否
    验证器=…
    通常不在数据库层上实现,它们由表单使用。通过在数据库层上添加它,您无法通过ORM调用使数据库处于不一致的状态更新
    rate
    @WillemVanOnsem我们如何将评级与班级故事联系起来?如何显示故事的平均比率?如何显示故事的比率?我使用的是ModelViewSet和ModelSerializer,比如本例中的
    url
    字段?