如何用抽象模型组织Django项目

时间:2009-10-13 05:56:15

标签: django django-models project-organization

我有几个型号:'文章,视频,BlogPost,新闻,商品'。每个都在他们自己的应用程序中。

它们基本上都是相同的模型,每个模型都有一些额外的字段。但每个共享约15个领域。我正在使用abstract base class。我正在试图弄清楚我应该如何为此做组织。我目前的设置是这样的:

apps/
    abstract_models.py
    abstract_templatetags.py
    abstract_forms.py
    articles/
        models.py
        ...
    videos/
        models.py
        ...
    blogs/
    ...

虽然我知道这不是一个好方法,但我不确定在哪里放置共享的所有信息。我一直这样做,然后每个应用程序只是继承Form或模型并进行本地修改。由于它们只是对整个画面的一小部分变化,我认为抽象类是要走的路,但我可能错了。

他们共享如此多的结构,但出于显而易见的原因,我想将它们分开保存。但我想稍微清理一下。

任何想法都会非常感激。

3 个答案:

答案 0 :(得分:4)

我设置了一个可以在不同项目中使用的应用,并将其命名为tools。在tools中,我有基本的基本模型,我倾向于在项目中重复使用,并在需要时导入它。

例如,我在CreatedModifiedModel中有一个tools/models.py,它添加了创建和修改时间的字段,以及创建和修改的用户。

定义一次后,我可以做到:

from tools.models import CreatedModifiedModel    

class Widget(CreatedModifiedModel):
    # comes with my four fields automatically

您可以创建一个名为basecoretools的应用,然后将所有抽象类放在那里,以帮助保持其清洁并使其在将来可重复使用。

答案 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%}