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

时间:2011-05-11 03:34:07

标签: python django reusability

我有点像一个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来解决这个问题,如果成功则定义字段,但现在我的电影应用程序明确地与数据库表定义中的评级相关联。

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

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

我也想知道这样做是否会有任何重大的性能损失。

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

3 个答案:

答案 0 :(得分:4)

在这种情况下,就个人而言,我会保持简单,只需将rating留在模型上即可。您必须平衡可重用性和实现的简单性。让事情可以重复使用真是太棒了,但是你的Movie模型真的有用,足以保证额外的工作吗?有一个依赖是不是很糟糕?我认为这些设计决策中很多都是主观的。今年在PyCon上就这个主题进行了很好的讨论:http://blip.tv/file/4882961

答案 1 :(得分:1)

首先,我同意上面的zeekay,你应该反省一下你的模型是否值得重复使用。

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

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

不要忘记实现可重用性是开发人员必须做出的基本价值判断,并且过度执行它可能与不在第一名。

答案 2 :(得分:0)

拥有依赖关系不一定是件坏事。对于像字段(rating,timedelta,JSON对象)这样的东西,没有内置字段可以满足你的需要,必须包含一个处理它的单独应用程序(可能还有一些相关的功能,比如模板标签)是一个特性,不是错误。

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