【问题标题】:About 20 models in 1 django app1 个 django 应用程序中约有 20 个模型
【发布时间】:2023-03-25 23:15:01
【问题描述】:

我已经开始为自己开发一个通过浏览器运行的本地应用程序。最近浏览了 django 教程,我认为使用 django 可能比使用普通 python 更好。

有一个问题:我至少有 20 个模型,每个模型都有很多功能。很简单,它将创建一个巨大的模型文件,并且可能还会创建巨大的视图。如何拆分它们?

models are all related 所以我不能简单地将它们变成单独的应用程序,可以吗?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    这是一个很常见的需求...我无法想象要翻阅一个 10,000 行长的 models.py 文件 :-)

    您可以将models.py 文件(以及views.py 也)拆分为一个包。在这种情况下,您的项目树将如下所示:

    /my_proj
        /myapp
            /models
                __init__.py
                person.py
    

    __init__.py 文件使文件夹成为一个包。唯一的问题是确保为您的模型定义一个内部 Meta 类,以指示模型的 app_label,否则 Django 将无法构建您的架构:

    class Person(models.Model):
        name = models.CharField(max_length=128)
    
        class Meta:
            app_label = 'myapp'
    

    完成后,将模型导入您的 __init__.py 文件,以便 Django 和同步数据库找到它:

    from person import Person
    

    这样你仍然可以做到from myapp.models import Person

    【讨论】:

    • 理论上可行,但运行教程“python manage.py sql gui”中的行没有任何作用,知道发生了什么吗?
    • 这通常意味着 django 找不到模型。确保你的 models.__init__.py 文件中有导入,并且你已经为每个模型设置了 app_label。还要确保您已删除旧的 models.py 文件。
    • 这在技术上是正确的,但 几乎 值得反对,因为它在实践中是个坏主意。如果你有足够多的模型考虑拆分你的 models.py,你应该拆分成多个应用程序。
    • Carl,我同意拆分成多个应用程序在大型项目中很有价值。 S. Lott 在他的帖子中的观点很好地表达了这一点。
    • +1 用于回答问题。将模型拆分为单独的文件有很多原因。购买特定的编码标准、文档,并减少常见的合并冲突。我不确定将不同的数据模型拆分为单独的物理资产是一种不好的做法。
    【解决方案2】:

    “我至少有 20 个模型”——这可能不止一个 Django“应用程序”,更像是一个包含几个小“应用程序”的 Django“项目”

    我喜欢围绕具有几个(1 到 5 个)模型的主题或主题领域进行划分。这变成了一个 Django“应用程序”——并且是可重用的有用单元。

    整个“项目”是一组应用程序,这些应用程序呈现由独立部分组成的集成事物。

    这也有助于项目管理,因为每个“应用程序”都可以成为一个 sprint,并在 th 结束时发布。

    【讨论】:

    • 但是如果模型必须相互关联,我该如何将它们放在单独的应用程序中?
    • 一个模型可以很容易地引用另一个包中的模型。您几乎总是有“高级”和“低级”模型。在一个应用程序中实现较低级别的模型。较高级别的应用可以依赖于较低级别的应用模型。
    • 任何时候您在 django.contrib.auth 中为 User 模型设置外键时,您都会在不同的应用程序之间建立关联...
    • 虽然这个答案通常可能是正确的解决方案,但我不同意它的整体性。我有项目,其中有 3-4 个视图,但像 20 个模型类。在不同的应用程序中拆分模型会增加复杂性。为什么 django 需要知道应用程序的内部结构?恕我直言,在这些情况下,正确的解决方案确实是拆分模型。
    • "可重用的有用单元" ,这是我这里的关键参考。
    【解决方案3】:

    这些模型都是相关的,所以我不能 只需将它们变成单独的应用程序 我可以吗?

    可以将它们分成单独的应用程序。要在一个应用中从另一个应用中使用模型,您只需像导入 django.contrib 应用一样导入它。

    【讨论】:

      【解决方案4】:

      在一个应用中拥有 20 个模型可能表明您应该将其拆分为更小的模型。

      Django 应用程序的目的是拥有一小段单一用途的代码,可以很好地组合在一起。

      因此,如果您有一个电子商务网站,您可能有一个 shopping_cart 应用程序、一个计费应用程序等等。

      请记住,相互依赖的应用程序确实没有问题(尽管可以将它们解耦总是更好),但您不应该让一个应用程序做两件截然不同的事情。

      文章Django tips: laying out an application 可能会对您有所帮助。与往常一样,对您阅读的所有内容持保留态度(包括此答案)。

      【讨论】:

        【解决方案5】:

        您可以将模型分解为多个文件。这也适用于视图。

        【讨论】:

          【解决方案6】:

          可以将它们拆分为单独的文件,并在您的主要 models.py 字段顶部简单地导入。

          你是否真的想要是另一个问题。

          【讨论】:

          • 正如 Jarret Hardie 所说,创建一个名为 models 的 python 包(即其中包含 init.py 文件的目录)是最好的方法。跨度>
          猜你喜欢
          • 1970-01-01
          • 2011-12-22
          • 2016-05-10
          • 2019-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-16
          • 2010-11-18
          相关资源
          最近更新 更多