我有点像一个Django初学者,并且一直试图尽可能地将我的应用程序解耦,并将其尽可能小的可重用部分构建。试图遵循James Bennett建立re-usable apps的策略。考虑到这一点,我遇到了这个问题。
假设我有一个存储电影信息的应用程序:
代码看起来像这样:
class Movie(models.Model):
name = models.CharField(max_length=255)
...
现在,如果我想添加评分,我可以使用django-rating,只需在我的模型中添加一个字段:
class Movie(models.Model):
name = models.CharField(max_length=255)
rating = RatingField(range=5)
...
这本身意味着我的电影应用程序现在依赖于django评级,如果我想重新使用它,但不再需要评级,我仍然需要安装django-ratings或修改并分叉我的应用程序。
现在,我可以通过使用try / except和import来解决这个问题,如果成功则定义字段,但现在我的电影应用程序明确地与数据库表定义中的评级相关联。
将两个模型分开并在评级模型中定义关系而不是电影似乎更明智。这样,依赖关系在我使用评级时定义,但在使用电影应用程序时不需要。
你如何处理这个问题?是否有更好的方法来分离模型?
我也想知道这样做是否会有任何重大的性能损失。
编辑:我想澄清一点,这更像是一个问题的例子,而且有点人为的说明一点。我希望能够在每次需要添加相关数据时添加其他信息而无需修改“电影”模型。我很感谢到目前为止的回复。
答案 0 :(得分:4)
在这种情况下,就个人而言,我会保持简单,只需将rating
留在模型上即可。您必须平衡可重用性和实现的简单性。让事情可以重复使用真是太棒了,但是你的Movie
模型真的有用,足以保证额外的工作吗?有一个依赖是不是很糟糕?我认为这些设计决策中很多都是主观的。今年在PyCon上就这个主题进行了很好的讨论:http://blip.tv/file/4882961
答案 1 :(得分:1)
首先,我同意上面的zeekay,你应该反省一下你的模型是否值得重复使用。
如果确实如此,您可以创建一个新的movierating
应用,其RatingModel
具有FK到movies.models.Movie
和rating
字段。
您永远不会将rating
以某种方式传递给模板。为此,您可以创建class-based-views,在movierating.views
中,您可以扩展并覆盖get_context
方法。
不要忘记实现可重用性是开发人员必须做出的基本价值判断,并且过度执行它可能与不在第一名。
答案 2 :(得分:0)
拥有依赖关系不一定是件坏事。对于像字段(rating,timedelta,JSON对象)这样的东西,没有内置字段可以满足你的需要,必须包含一个处理它的单独应用程序(可能还有一些相关的功能,比如模板标签)是一个特性,不是错误。
更多问题是当您的应用模型引用其他应用中的模型时。当然,这发生在现实世界中,但在这种情况下,它会使识别孤立模型变得更加困难。