Django的。一个应用程序有很多模型与许多应用程序与单一模型

时间:2011-05-23 16:20:16

标签: django django-models

我目前正在Django开发自己的博客。但是我已经开始坚持了。所以,这是我的树层次结构:

/pyroot/nemoden/
|~blog/
| |-__init__.py
| |-admin.py
| |-models.py
| |-tests.py
| `-views.py
|+css/
|+images/
|+js/
|~templates/
| |-index.html
| `-postslist.html
|-__init__.py
|-manage.py
|-settings.py
`-urls.py

我所做的是:创建一个名为blog的新应用程序,并在blog/models.py(用户,帖子,评论等)中描述我需​​要的所有博客模型,但后来我看了Jeff Hui's { {3}}并意识到这可能是一个坏主意,在Django-world人们不这样做......我们在PHP-world使用我们的PHP Frameworks做什么。我想最好为标签,评论,用户等提供杰出的Django应用程序......

所以,我问的是:

每个Django-app有一个模型更好吗?如果是这样,当我不应该为模型创建新的Django-app时会有一些例外吗?

我想和:

/pyroot/nemoden/
|~blog/ # this is actual application (not a django-application). It uses all the models in views.py, so django-apps becomes just models
| |-__init__.py
| |-tests.py
| `-views.py # all the views (controllers in other frameworks) used by our (well,... my) weblog
|+css/
|+images/
|+js/
|~templates/
| |-index.html
| `-postslist.html
|-__init__.py
|~post/
| |-__init__.py
| |-tests.py
| |-admin.py
| |-models.py # only Post model goes here
| `-views.py
|~tag/
| |-__init__.py
| |-tests.py
| |-admin.py
| |-tag.py # only Tag model goes here
| `-views.py # <---- I don't know why we still need it here!
|-manage.py
|-settings.py
`-urls.py

如您所见,我从models.py应用中删除了admin.pyblog,现在blog应用更像the appmain app你希望使用所有模型(django-apps),主要由views.py组成。而且我认为现在我们并不需要所有views.py django-apps(这个问题在一个大问题之下,但它只是在理论上)。

我的方法有什么好处,否则我现在会遇到隐形问题,也许?

如果我的问题不够明确,我很抱歉,如果是,请在下面发表评论,我会对其进行编辑以使其更加清晰。

是否有最佳做法?

谢谢。

5 个答案:

答案 0 :(得分:34)

  

每个人有一个模型更好吗?   Django的应用?

可重用应用程序的一个关键想法是:做一件事,做得好

如果应用需要多个模型(PostEntry,PostAuthor,如果是博客应用),这绝不是坏事。然而,标签,类别,评论代表了不同的功能,理想情况下可以在另一个环境中重复使用,因此应该作为独立的应用程序进行分发。

  

有最佳做法吗?

为了感受一个好的应用程序组织,我首先看一下Django Reusable App Conventions

然后你准备好了James Bennett关于来自DjangoCon 2008 Resuable AppsSlides的讨论。另一个更近期对同一主题的看法是来自PyCon 2011的Pluggable Django Application Patterns

答案 1 :(得分:12)

经验法则不是“app”应该是一个完整的功能。如果您的博客无法在没有标签的情况下运行(就像字面意思一样,不仅仅有一个带有标签的博客比没有标签更好)那么标签应该是博客应用程序的一部分。

然而,这里没有明确的答案。一些应用程序纯粹主义者完全专注于可重用性,并使每个应用程序成为一个独立的功能,几乎没有任何依赖性。有些人使用一个Django应用程序创建整个应用程序。在您的特定情况下,您可以自行决定最有意义的内容。

一般情况下,我会说组合功能不会被其他人使用,但是应用程序需要这些功能,所有功能都在同一个应用程序中。像标签或评论这样的东西可能是他们自己的应用程序的候选者,事实上,你可以找到许多这样的应用程序,只需插入你的应用程序即可提供该功能。

在任何比简单的待办事项列表更复杂的应用程序中,你不可避免地会最终得到大量的交叉。没有一个正确的答案。只需使用常识并思考DRY(不要重复自己),你就可以了。

答案 2 :(得分:6)

我在youtube上找到了这个人,说他处理了这个确切的问题:他们都有一个巨大的应用程序和许多他认为不好的小人物。

http://youtu.be/URztqq1kiqI?t=22m39s

根据我自己的经验:你不需要一个大的应用程序,因为人们可以处理更好的文件夹树,这些文件树传播一点点,但不是太多。拥有一个应用程序会更难理解项目的组成部分(适用于新人)

另一方面,你拥有的应用程序越多(彼此依赖),就越有可能遇到循环导入问题。所以你需要一个避免这些事情的策略。在这里,新成员也倾向于将项目推向问题。

总而言之,那些在更多项目上开发更长时间的人通常应该是做出架构决策的人。

答案 3 :(得分:1)

我的主观观点是应用程序具有可重用性。如果它们确实可重用,则可以在下一个项目中安装pip。因此,基本上可重用的应用程序应与您的代码库分开,最好是在pypi上。

我每个项目只使用一个应用程序,并使用软件包来拆分模块。

例如

之前

journal/
  models.py

之后

journal/
   models/  # All models share the same database namespace. In this case 'journal_'
      __init__.py
      auth.py
      page.py

答案 4 :(得分:0)

Nemoden,您对更改项目树的方法是正确的。您应该将应用程序划分为更小的功能,因为这将使您的应用程序更加模块化,并且代码将在未来更可重用