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统计字段中。