我在应用程序中有两个模型用于评估音乐曲目,我想重构模型。
class Artist(models.Model):
""" Description: Author model """
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class MusicTrack(models.Model):
""" Description: Music Track Model """
title = models.CharField(max_length=20)
artist = models.ForeignKey(Artist)
link = models.URLField()
# rating data
rating_count = models.PositiveIntegerField()
score = models.DecimalField(max_digits=2, decimal_places=1)
def __unicode__(self):
return self.title
这是初始设置,我想将评级与音乐应用分开,但我不确定是否重构设置,我是否应考虑将评级数据重构为其他模型? 我认为不要重构,因为当我显示音乐曲目信息时,我也必须显示收视率,这是每首歌曲的额外加入/查询。我更重要的是因为我认为将评级分开是更好的,就像评论一样。
class Rating(models.Model):
rating_count = models.PositiveIntegerField()
score = models.DecimalField(max_digits=2, decimal_places=1)
def __unicode__(self):
...?
class MusicTrack(models.Model):
""" Description: Music Track Model """
title = models.CharField(max_length=20)
artist = models.ForeignKey(Artist)
link = models.URLField()
rating = models.OneToOneField(Rating)
def __unicode__(self):
return self.title
问题
1.我是否应该考虑将MusicTrack
重构为单独的模型Rating
?
2.分离比不分配有什么好处?
3.如果我将MusicTrack
重构为Rating
模型,那么显示相关__unicode__
标题的MusicTrack
方法是什么?
答案 0 :(得分:0)
我认为你的评级含义超载了。
如果您想为会计目的存储每个单独的评级,您可以设置一个模型,您可能希望这样做以确保用户不能评价两次(但是您还需要添加标识符)
如果您只想显示曲目的评分,可以将其保留在模型上。没关系。
除非显示该记录有用,否则我不会重载unicode,但您可以使用“Rating:%d”或“Rating:%d for%s”重载。
答案 1 :(得分:0)
您的评级对象不是真实对象。这更像是一种行为。实际上,音乐曲目可以被评级,但也可以是艺术家或专辑。在python中,没有用于实现hebavior的接口,但是我们有多个继承。 所以我建议你这样做:
class RateModel(models.Model):
rating_count = models.PositiveIntegerField()
score = models.DecimalField(max_digits=2, decimal_places=1)
class Meta:
abstract = True
RatedModel
class class MusicTrack(RateModel):
如果您的大部分应用都需要型号,我建议您创建一个core
应用并将模型放入其中。
答案 2 :(得分:0)
更好的是,保留两种解决方案。
在MusicTrack模型中保留avarage / count字段,以便即时访问总费率。
在与ex关联的另一个模型中保持分离评级。用户。 这个将允许用户跟踪他的费率历史,并将避免用户将多次评价一个音乐曲目的问题。