【问题标题】:How to organize Django project with abstract models如何使用抽象模型组织 Django 项目
【发布时间】:2009-10-13 05:56:15
【问题描述】:

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

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

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

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

它们共享如此多的结构,但出于显而易见的原因,我希望将它们保持为独立的应用程序。但我想清理一下。

任何想法将不胜感激。

【问题讨论】:

    标签: django django-models project-organization


    【解决方案1】:

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

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

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

    from tools.models import CreatedModifiedModel    
    
    class Widget(CreatedModifiedModel):
        # comes with my four fields automatically
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        在我的公司,我们通常将我的 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%}
        

        【讨论】:

          猜你喜欢
          • 2018-06-16
          • 2012-04-07
          • 1970-01-01
          • 2018-12-15
          • 1970-01-01
          • 2017-03-15
          • 2013-09-16
          • 2017-05-05
          • 2015-08-01
          相关资源
          最近更新 更多