1 django应用程序中约有20个型号

Tei*_*ion 37 python django django-models

我已经开始在自己的本地应用程序上运行浏览器.最近经历了django教程,我认为使用django而不仅仅是普通的python可能会更好.

有一个问题:我至少有20个型号,每个型号都有很多功能.很简单,它将创建一个巨大的模型文件,也可能是巨大的视图.我该如何拆分它们?

这些模型都是相关的,所以我不能简单地将它们分成单独的应用程序吗?

Jar*_*die 72

这是一个非常普遍的需求......我无法想象涉及10,000个行长的models.py文件:-)

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

/my_proj
    /myapp
        /models
            __init__.py
            person.py
Run Code Online (Sandbox Code Playgroud)

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

class Person(models.Model):
    name = models.CharField(max_length=128)

    class Meta:
        app_label = 'myapp'
Run Code Online (Sandbox Code Playgroud)

完成后,在您的__init__.py文件中导入模型,以便Django和sync db可以找到它:

from person import Person
Run Code Online (Sandbox Code Playgroud)

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

  • 这在技术上是正确的,但是至少是值得的,因为它在实践中是一个如此糟糕的主意.如果你有足够的模型来考虑拆分models.py,你应该分成多个应用程序. (11认同)
  • +1回答问题.将模型拆分为单独的文件有很多原因.特定于商店的编码标准,文档和减少合并冲突是常见的.我不确定如何将不同的数据模型拆分成单独的物理资产是不好的做法. (3认同)
  • Carl,我同意分成多个应用程序在大型项目中很有价值.S. Lott在他的帖子中的观点很好地表达了这一点. (2认同)

S.L*_*ott 31

"我至少有20个型号" - 这可能是不止一个Django"应用程序",更像是一个带有几个小"应用程序"的Django"项目"

我喜欢围绕具有少量(1到5)模型的主题或主题区域进行分区.这成为Django"应用程序" - 并且是可重用性的有用单元.

整个"项目"是一组应用程序,它们呈现由单独部分构成的集成事物.

这也有助于项目管理,因为每个"app"都可以成为一个sprint,并在最后发布.

  • 每次在django.contrib.auth中为User模型设置外键时,您都会在不同的应用程序之间进行关联... (13认同)
  • 虽然这个答案通常可能是正确的解决方案,但我不同意它的总体情况.我有项目,其中有3-4个视图,但像20个模型类.在不同的应用程序中分割模型会增加复杂性.django为什么要知道应用程序的内部结构?Imho,在这些情况下正确的解决方案确实分裂了模型. (3认同)
  • 一个模型可以轻松地参考另一个包中的模型.你几乎总是拥有"更高级别"和"更低级别"的模型.在一个应用程序中实现较低级别的模型.较高级别的应用程序可能依赖于较低级别的应用程序模型. (2认同)

Nat*_*anD 16

这些模型都是相关的,所以我不能简单地将它们分成独立的应用程序吗?

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

  • +1.对于依赖于彼此的应用程序,没有法律规定. (15认同)

Flá*_*iro 5

在一个应用程序中拥有20个模型可能表明您应该将其分解为较小的模型.

Django应用程序的目的是拥有一个小的单一用途代码,它可以很好地融合在一起.

因此,如果您有一个电子商务网站,您可能有一个shopping_cart应用程序,一个结算应用程序,等等.

请记住,相互依赖的应用程序确实没有问题(尽管如果它们可以分离,它总是更好),但是你不应该让应用程序执行两个截然不同的事情.

文章Django提示:布置应用程序可能对您有所帮助.和往常一样,把你读过的所有东西都拿出来(包括这个答案).