你如何管理你的Django应用程序?

7

我只是想尝试用Django构建一个项目。因此,我有一个(基本的)问题,关于如何管理这样的项目。由于我找不到任何指南或者如何将一个项目拆分成应用程序的信息。

以SO为例。你会使用哪些应用程序?我认为应该有“用户”和“问题”这两个应用程序。但是如果有一个话题系统,其中包含静态文章,也可以接受投票呢?那么如何构建应用程序结构呢?是为“问题”,“投票”和“话题”各建立一个应用程序,还是只建立一个名为“内容”的应用程序?

我不知道该怎么做。也许是因为我对Django还不够了解,但我很感兴趣...

5个回答

6
没有硬性规定,但我认为更好的做法是倾向于使用更专业的应用程序。理想情况下,一个应用程序应该只处理一个功能上的关注点:例如“标记”、“评论”、“auth/auth”或“帖子”。这种设计方式也将帮助您重复使用可用的开源应用程序,而不是重新发明轮子(例如Django带有authcomments应用程序,django-taggingdjango-taggable几乎肯定可以满足您的需求等)。通用外键可以帮助您解耦应用程序,例如标记或评论可能适用于多个其他应用程序的模型。

5

您应该尽可能将项目分为多个应用程序。对于大多数项目,一个应用程序不会包含超过5个模型。例如,像SO这样的项目将为UsersProfiles、Questions、Tags(在Django中有一个现成的标签)等单独创建应用程序。如果有静态页面系统,那么也应该是一个单独的应用程序(为此有现成的应用程序)。您还应该尽可能使您的应用程序通用,以便在其他项目中重复使用它们。有一份关于可重用应用程序的好演示文稿


3
+1:小型且可重复使用——聚焦于一个或极少数密切相关的实体。 - S.Lott

3

就像任何一组依赖项一样...尝试找到项目中最有用的独立部分,并将其制作成独立的应用程序。其他Django应用程序将具有更高级别的功能,并重用您设置的最低级别应用程序的部分。

在我的项目中,我有一个带有自己的Event对象的日历应用程序。我还设置了一个拼车数据库,对于出发时间和持续时间,我直接在我的RideShare表中使用了日历的Event对象。 拼车数据库是与日历相关的,并从日历应用程序获得所有漂亮的.ics导出和日历视图。

有一些技巧可以使应用程序可重用,例如命名模板目录:project/app2/templates/app2/index.html。这使您可以从任何其他应用程序引用app2/index.html,并获取正确的模板。我从Django本身的内置可重用应用程序中学到了这个技巧。Pinax在大小方面有点庞大,但它还演示了一种不错的可重用应用程序结构。

如果有疑问,现在先忘记可重用的应用程序。将所有消息和投票放在一个应用程序中,并完成一次修订。在此过程中,您将发现哪些步骤感觉不必要,并且可以在未来作为独立的内容进行拆分。


3
决定是否编写应用程序时,可以问自己一个好问题:“我能在另一个项目中使用这个吗?”如果你认为可以,那么考虑如何使应用程序尽可能独立; 如何减少依赖,使应用程序不依赖于特定于某个项目的任何内容。
以下是一些方法:
- 给每个应用程序提供自己的urls.py。 - 允许将模型类型作为参数传递,而不是明确声明视图中使用哪些模型。通用视图使用此原则。 - 通过在urls.py中传递某种template_name参数,使您的模板易于被覆盖。 - 确保您可以使用对象和视图进行反向url查找。这意味着在urls.py中命名您的视图,并在您的模型上创建get_absolute_url方法。 - 在某些情况下,例如标记,可以使用GenericForeignKeys将您的应用程序中的模型与任何其他模型相关联,而不管它是否具有“回溯”ForeignKeys。

0
我来告诉你我如何解决这样的问题:通常我会拿着一张纸,画出盒子(功能)和箭头(功能之间的相互依赖关系)。当然,我相信还有其他可以帮助你的方法和工具,但是我的方法通常对我有用。(当然,结果因人而异。)
虽然,要知道一个网站应该是什么样子是基础。;)

但是在哪里划分一个功能和另一个功能之间的界限呢? - okoman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接