我有几个型号:'文章,视频,BlogPost,新闻,商品'。每个都在他们自己的应用程序中。
它们基本上都是相同的模型,每个模型都有一些额外的字段。但每个共享约15个领域。我正在使用abstract base class。我正在试图弄清楚我应该如何为此做组织。我目前的设置是这样的:
apps/
abstract_models.py
abstract_templatetags.py
abstract_forms.py
articles/
models.py
...
videos/
models.py
...
blogs/
...
虽然我知道这不是一个好方法,但我不确定在哪里放置共享的所有信息。我一直这样做,然后每个应用程序只是继承Form或模型并进行本地修改。由于它们只是对整个画面的一小部分变化,我认为抽象类是要走的路,但我可能错了。
他们共享如此多的结构,但出于显而易见的原因,我想将它们分开保存。但我想稍微清理一下。
任何想法都会非常感激。
答案 0 :(得分:4)
我设置了一个可以在不同项目中使用的应用,并将其命名为tools
。在tools
中,我有基本的基本模型,我倾向于在项目中重复使用,并在需要时导入它。
例如,我在CreatedModifiedModel
中有一个tools/models.py
,它添加了创建和修改时间的字段,以及创建和修改的用户。
定义一次后,我可以做到:
from tools.models import CreatedModifiedModel
class Widget(CreatedModifiedModel):
# comes with my four fields automatically
您可以创建一个名为base
或core
或tools
的应用,然后将所有抽象类放在那里,以帮助保持其清洁并使其在将来可重复使用。
答案 1 :(得分:1)
Pinax project与群组类似。他们创建了一个基类,并将它扩展到一个应用程序中。
/apps
/group
base.py
...
/projects
models.py
...
组织它似乎很棒。您可以在github上查看他们的源代码。
答案 2 :(得分:1)
在我公司,我们通常将Django项目的所有抽象组件组织到一个名为common
的应用程序中。除了没有网址和具体模型外,它的结构与普通Django应用相同。与其他任何应用程序一样,它已安装在settings.py
中。
它也是粘贴任何全局使用的mixin或异常的好地方。
my_prjoject/
common/
models.py <- abstract models only
templates/
common/
base.html
views.py
mixins.py
exceptions.py
article/
models.py
views.py
urls.py
templates/
atricle/
detail.html
...
注意:以单数形式命名您的应用。如果您不这样做,鸟类就会攻击您。
有了这个应用程序,我可以从任何其他应用程序中引用它,例如:
article / models.py:
from common import models as common_models
class Article(common_models.BaseModel):
additional_field = models.CharField(max_length=10) # Whatever
article / views.py:
from common import views as common_views
class Detail(common_views.DetailBase):
template_name = "article/detail.html"
atricle / templates / article / detail.html:
{% extends 'common/base.html' %}
{% block base %}
<h1>If you downvote this answer, I will fight you</h1>
{% endblock base%}