5

我有几个模型:“文章、视频、博客文章、新闻、商品”。每个都在自己的应用程序中。

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

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

虽然我知道这不是一个好方法,但我只是不确定将所有共享信息放在哪里。我一直在这样做,然后每个应用程序只需将表单或模型子类化并进行本地修改。由于它们只是相对于整个图片的少量更改,我认为抽象类是要走的路,但我可能错了。

它们共享如此多的结构,但出于显而易见的原因,我想将它们分开应用程序。但我想清理一下。

任何想法将不胜感激。

4

3 回答 3

5

我设置了一个可以在不同项目中使用的应用程序并调用它tools。在tools我有我的基本基本模型,我倾向于跨项目重用并在需要的地方导入它。

例如,我CreatedModifiedModeltools/models.py其中添加了创建和修改时间的字段,以及进行创建和修改的用户。

定义一次后,我可以简单地做:

from tools.models import CreatedModifiedModel    

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

您可以创建一个名为baseor coreor的应用程序tools,然后将所有抽象类放入其中,以帮助保持其清洁并使其在未来可重用。

于 2009-10-13T11:33:33.713 回答
2

Pinax 项目与组有相似之处。他们已经创建了自己的基类以及将其扩展至应用程序的基类。

/apps
    /group
        base.py
        ...
    /projects
        models.py
        ...

组织起来似乎很棒。您可以在 github 上查看他们的源代码。

于 2009-10-13T06:53:17.067 回答
1

在我的公司,我们通常将 Django 项目的所有抽象组件组织到一个名为common. 它的结构与普通的 Django 应用程序一样,只是它没有 url,也没有具体的模型。它安装在 中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
  ...

注意:以单数形式命名您的应用程序。如果你不这样做,鸟会攻击你。

有了这个应用程序,我可以从任何其他应用程序中引用它,例如:

文章/models.py:

from common import models as common_models


class Article(common_models.BaseModel):
    additional_field = models.CharField(max_length=10) # Whatever

文章/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%}
于 2020-01-30T00:19:09.430 回答