我目前正在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.py
和blog
,现在blog
应用更像the app
或main app
你希望使用所有模型(django-apps),主要由views.py
组成。而且我认为现在我们并不需要所有views.py
django-apps
(这个问题在一个大问题之下,但它只是在理论上)。
我的方法有什么好处,否则我现在会遇到隐形问题,也许?
如果我的问题不够明确,我很抱歉,如果是,请在下面发表评论,我会对其进行编辑以使其更加清晰。
是否有最佳做法?
谢谢。
答案 0 :(得分:34)
每个人有一个模型更好吗? Django的应用?
可重用应用程序的一个关键想法是:做一件事,做得好
如果应用需要多个模型(PostEntry,PostAuthor,如果是博客应用),这绝不是坏事。然而,标签,类别,评论代表了不同的功能,理想情况下可以在另一个环境中重复使用,因此应该作为独立的应用程序进行分发。
有最佳做法吗?
为了感受一个好的应用程序组织,我首先看一下Django Reusable App Conventions。
然后你准备好了James Bennett关于来自DjangoCon 2008 Resuable Apps的Slides的讨论。另一个更近期对同一主题的看法是来自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)