Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.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_Django Models_Refactoring - Fatal编程技术网

Python 我是否应该拆分这个Django模型?

Python 我是否应该拆分这个Django模型?,python,django,django-models,refactoring,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:

我在一个应用程序中有两个模型用于对音乐曲目进行评级,我想重构模型

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 <代码>考虑到一个单独的模型中,<代码>评级>代码>? 2.分离比不分离有什么好处?
3.如果我将
MusicTrack
重构为
Rating
模型,那么显示相关
MusicTrack
标题的
\uuuuUnicode\uucode>方法会是什么?

我认为你在夸大评级的含义

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

如果您只想显示曲目的分级,可以将其保留在模型上。很好


除非显示该记录很有用,否则我不会重载unicode,但您可以使用“分级:%d”或“分级:%d for%s”重载。我认为您重载了分级的含义

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

如果您只想显示曲目的分级,可以将其保留在模型上。很好


除非显示该记录很有用,否则我不会重载unicode,但您可以使用“分级:%d”或“分级:%d for%s”重载。您的分级对象不是真实的对象。这更像是一种行为。事实上,一首音乐曲目既可以被评为等级,也可以被评为艺术家或专辑。在python中,没有实现hebavior的接口,但我们有多重继承。 下面是我给你的建议:

  • 创建一个抽象模型:
  • class RateModel(models.Model):
    rating_count=models.PositiveIntegerField()
    分数=型号。小数字段(最大位数=2,小数位数=1)
    类元:
    抽象=真
    
  • RatedModel
    class继承需要此行为的对象
  • class MusicTrack(速率模型):
    

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

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

  • 创建一个抽象模型:
  • class RateModel(models.Model):
    rating_count=models.PositiveIntegerField()
    分数=型号。小数字段(最大位数=2,小数位数=1)
    类元:
    抽象=真
    
  • RatedModel
    class继承需要此行为的对象
  • class MusicTrack(速率模型):
    

    如果您的大多数应用程序都需要模型,我建议您创建一个
    核心
    应用程序,并将您的模型放在其中。

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

  • 在MusicTrack模型中保留avarage/count字段,以便即时访问总速率

  • 在与ex.user链接的另一个模型中保持单独的评级。 这将允许用户跟踪其速率历史记录,并将避免用户对一首音乐曲目进行多次速率的问题


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

  • 在MusicTrack模型中保留avarage/count字段,以便即时访问总速率

  • 在与ex.user链接的另一个模型中保持单独的评级。 这将允许用户跟踪其速率历史记录,并将避免用户对一首音乐曲目进行多次速率的问题


  • 所以不同表上的值不一样?听起来更像是一个与用户模型相关的字段。我想同时更新这两个字段会很困难,如果两个表上的值相同,那么成本会很高。请阅读django中的信号。在post_save中有一个“created”参数。如果created为True,则有人添加了一个新的速率。因此,将其添加到您的评级模型和post_save update MusicTrack统计字段中。这样不同表上的值就不会相同了?听起来更像是一个与用户模型相关的字段。我想同时更新这两个字段会很困难,如果两个表上的值相同,那么成本会很高。请阅读django中的信号。在post_save中有一个“created”参数。如果created为True,则有人添加了一个新的速率。因此,将其添加到您的评级模型和post_save update MusicTrack统计字段中。