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平均']
您可以做一些改进:
用户
和故事
一起唯一,这样用户就不能对同一故事进行两次评分李>
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
字段?