2015-11-08 45 views
1

我有两个模型在评价音乐曲目的应用程序中,我想重构模型。我应该拆分这个Django模型吗?

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

我认为你超负荷的评价意义。

如果你想存储每个个体评级为会计目的,你可以有一个模型,你可能想这样做,以确保用户无法速率的两倍(但你还需要增加一个标识符)

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

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

0

您的评级对象不是一个真正的对象。这更多的是一种行为。事实上,音乐曲目可以被评分,但也可以是艺术家或专辑。在python中,没有实现hebavior的接口,但我们有多重继承。 因此,这里是我建议你:

  1. 创建一个抽象RateModel:
class RateModel(models.Model): 
    rating_count = models.PositiveIntegerField() 
    score = models.DecimalField(max_digits=2, decimal_places=1) 

    class Meta: 
     abstract = True 
  • 继承你的对象,从RatedModel类需要这种行为
  • class MusicTrack(RateModel): 
    

    如果你的大多数应用都需要一个模型,我建议y ou创建一个core应用程序并将您的模型放入其中。

    0

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

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

    2. 在与前链接的另一个模型中保持独立评级。用户。 这一个将允许用户跟踪他的利率历史,并将避免用户将多次为一首音乐曲目评分的问题。

    +0

    这样在不同的表上就不会有相同的值了吗?听起来更像是一个用户模型相关领域。我猜想同时更新这两个字段会非常困难,如果两个表的值相同,则会非常昂贵。 – Deena

    +0

    阅读django中的信号。 https://docs.djangoproject.com/en/1.8/ref/signals/#django.db.models.signals.post_save 在post_save中有'创建'的参数。如果创建为True,则有人添加了新的费率。因此,将其添加到您的评分模型和post_save更新MusicTrack统计字段。 – ImportError