我应该拆分这个Django模型吗?

时间:2015-11-08 16:02:49

标签: python django django-models refactoring

我在应用程序中有两个模型用于评估音乐曲目,我想重构模型。

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方法是什么?

3 个答案:

答案 0 :(得分:0)

我认为你的评级含义超载了。

如果您想为会计目的存储每个单独的评级,您可以设置一个模型,您可能希望这样做以确保用户不能评价两次(但是您还需要添加标识符)

如果您只想显示曲目的评分,可以将其保留在模型上。没关系。

除非显示该记录有用,否则我不会重载unicode,但您可以使用“Rating:%d”或“Rating:%d for%s”重载。

答案 1 :(得分:0)

您的评级对象不是真实对象。这更像是一种行为。实际上,音乐曲目可以被评级,但也可以是艺术家或专辑。在python中,没有用于实现hebavior的接口,但是我们有多个继承。 所以我建议你这样做:

  1. 创建一个抽象的RateModel:
  2. class RateModel(models.Model):
         rating_count = models.PositiveIntegerField()
         score = models.DecimalField(max_digits=2, decimal_places=1)
    
         class Meta:
             abstract = True
    
    1. RatedModel class
    2. 继承需要此行为的对象
      class MusicTrack(RateModel):
      

      如果您的大部分应用都需要型号,我建议您创建一个core应用并将模型放入其中。

答案 2 :(得分:0)

更好的是,保留两种解决方案。

  1. 在MusicTrack模型中保留avarage / count字段,以便即时访问总费率。

  2. 在与ex关联的另一个模型中保持分离评级。用户。 这个将允许用户跟踪他的费率历史,并将避免用户将多次评价一个音乐曲目的问题。