创建可重用的Django应用?

12 投票
3 回答
706 浏览
提问于 2025-04-16 17:24

我算是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 个回答

0

有依赖并不一定是坏事。比如说,当你需要一个字段(比如评分、时间间隔、JSON对象),而系统里没有现成的字段可以用时,包含一个单独的应用来处理这些需求(可能还包括一些相关的功能,比如模板标签)其实是一种优点,而不是缺点。

更麻烦的是,当你的应用模型引用了其他应用的模型时。虽然在现实中这种情况很常见,但这样一来,就很难把模型分开来看了。

1

首先,我同意上面提到的观点,你需要考虑一下,是否真的值得为了你的模型去追求那么多的可重用性。

如果确实值得的话,你可以创建一个新的 movierating 应用,这个应用里面会有一个 RatingModel,它会和 movies.models.Movie 通过外键(FK)关联,并且包含一个 rating 字段。

不过,你还是需要以某种方式把 rating 传递给模板。为此,你可以创建一些 基于类的视图,然后在 movierating.views 中扩展和重写 get_context 方法。

别忘了,实现可重用性 是开发者必须做出的一个基本的 价值判断,过度追求可重用性可能和根本不追求一样糟糕。

4

在这种情况下,我个人觉得保持简单就好,可以直接在模型里保留 rating(评分)。你需要在可重用性和实现的简单性之间找到一个平衡点。让东西变得可重用当然很好,但你的 Movie(电影)模型真的有那么有用吗,值得你花额外的功夫去处理这些吗?而且,有一些依赖关系真的那么糟糕吗?我觉得很多这样的设计决策都是主观的。今年在PyCon上有一个关于这个主题的很不错的演讲:http://blip.tv/file/4882961

撰写回答