创建可重用的Django应用?
我算是Django的新手,一直在尝试尽量把我的应用拆分得更独立,把它们做成尽可能小的可重用组件。我在努力跟随James Bennett的策略,构建可重用的应用。在这个过程中,我遇到了一个问题。
假设我有一个应用,用来存储电影的信息:
代码大概是这样的:
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-ratings。如果我想重用这个应用,但又不需要评分功能,我仍然得安装django-ratings,或者修改并分叉我的应用。
我可以通过使用try/except来处理这个问题,尝试导入并在成功时定义字段,但这样一来,我的电影应用就明确地和数据库表中的评分绑定在一起了。
把这两个模型分开,并在评分模型中定义它们的关系,似乎更合理。这样,当我使用评分功能时才会有依赖,而在使用电影应用时就不需要这个依赖了。
你们是怎么解决这个问题的?有没有更好的方法来分离这些模型?
我也想知道这样做是否会有明显的性能损失。
补充说明:我想澄清一下,这只是一个问题的例子,可能有点牵强,目的是为了说明我的观点。我希望能在不每次修改“电影”模型的情况下,添加额外的信息。感谢大家的回复。
3 个回答
有依赖并不一定是坏事。比如说,当你需要一个字段(比如评分、时间间隔、JSON对象),而系统里没有现成的字段可以用时,包含一个单独的应用来处理这些需求(可能还包括一些相关的功能,比如模板标签)其实是一种优点,而不是缺点。
更麻烦的是,当你的应用模型引用了其他应用的模型时。虽然在现实中这种情况很常见,但这样一来,就很难把模型分开来看了。
首先,我同意上面提到的观点,你需要考虑一下,是否真的值得为了你的模型去追求那么多的可重用性。
如果确实值得的话,你可以创建一个新的 movierating
应用,这个应用里面会有一个 RatingModel
,它会和 movies.models.Movie
通过外键(FK)关联,并且包含一个 rating
字段。
不过,你还是需要以某种方式把 rating
传递给模板。为此,你可以创建一些 基于类的视图,然后在 movierating.views
中扩展和重写 get_context
方法。
别忘了,实现可重用性 是开发者必须做出的一个基本的 价值判断,过度追求可重用性可能和根本不追求一样糟糕。
在这种情况下,我个人觉得保持简单就好,可以直接在模型里保留 rating
(评分)。你需要在可重用性和实现的简单性之间找到一个平衡点。让东西变得可重用当然很好,但你的 Movie
(电影)模型真的有那么有用吗,值得你花额外的功夫去处理这些吗?而且,有一些依赖关系真的那么糟糕吗?我觉得很多这样的设计决策都是主观的。今年在PyCon上有一个关于这个主题的很不错的演讲:http://blip.tv/file/4882961