创建可重用的 Django 应用程序?

Posted

技术标签:

【中文标题】创建可重用的 Django 应用程序?【英文标题】:Creating Reusable Django Apps? 【发布时间】:2011-08-22 23:15:56 【问题描述】:

我有点像 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)
    ...

这本质上意味着我的 Movie 应用程序现在依赖于 django-ratings,如果我想重新使用它,但不再需要评级,我仍然需要安装 django-ratings 或修改并分叉我的应用程序。

现在,如果成功,我可以通过使用 try/except 和 import 并定义字段来解决这个问题,但现在我的电影应用程序明确绑定到数据库表定义中的评级。

将这两个模型分开并在收视率模型而不是电影中定义关系似乎更明智。这样,在我使用评级时定义了依赖关系,但在使用电影应用程序时不需要。

你如何处理这个问题?有没有更好的方法来分离模型?

我还想知道这样做是否会对性能造成重大影响。

编辑:我想澄清一下,这更多是问题的一个例子,并且有点人为地说明了一点。我希望能够在每次需要添加相关数据时添加附加信息,而无需修改“电影”模型。我很欣赏到目前为止的回复。

【问题讨论】:

【参考方案1】:

在这种情况下,就我个人而言,我会保持简单,并在模型上留下rating。您必须在可重用性和实现简单性之间取得平衡。使东西可重用很棒,但是您的 Movie 模型真的有用到足以保证额外的工作吗?依赖有那么糟糕吗?我认为这些设计决策中的大部分都是主观的。今年 PyCon 上有一个关于这个主题的精彩演讲:http://blip.tv/file/4882961

【讨论】:

【参考方案2】:

首先,我同意上述 zeekay 的观点,您应该反思一下,对于您的模型而言,如此多的可重用性是否值得。

如果确实如此,您可以创建一个新的movierating 应用程序,该应用程序有一个RatingModel,具有FK 到movies.models.Movierating 字段。

您永远不会将rating 以某种方式传递给模板。为此,您可以创建 class-based-views 并在 movierating.views 中扩展和覆盖 get_context 方法。

不要忘记实现可重用性是开发人员必须做出的基本价值判断,过度使用它可能与不这样做一样糟糕第一名。

【讨论】:

【参考方案3】:

拥有依赖并不一定是坏事。对于诸如字段(评级、时间增量、JSON 对象)之类的东西,没有内置字段可以满足您的需要,因此必须包含一个单独的应用程序来处理该字段(可能还有一些相关的功能,如模板标签)是一项功能,不是错误。

更多的问题是当您的应用模型引用其他应用的模型时。当然,这发生在现实世界中,但在这种情况下,识别孤立模型变得更加困难。

【讨论】:

以上是关于创建可重用的 Django 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 项目中为可重用应用程序创建基于类的 Celery 任务

django 可重用应用程序:删除迁移中的依赖项?

如何在 Django 中重用可重用的应用程序

如何为 django 可重用应用程序启动测试?

在实际生产项目中部署(管理依赖)django 可重用应用程序的最佳实践是啥?

Django:为可重用模型字段创建一个 Mixin