Django项目中的models.py与应用程序中的models.py有何区别?

20
我正在学习Django,试图理解项目中的models.py与应用程序中的使用区别。从教程示例中看来,我需要在应用程序中包含模型定义,但是当我尝试将此知识应用于我自己现有的数据库时,遇到了问题。
我使用了一个我正在使用的数据库(当然是副本),并使用inspectdb将概念模式生成为Django模型。我是在项目级别上这样做的,然后假定我可以编写在该项目中的应用程序中使用子模式的应用程序。
但是,根据教程的概括,它们在应用程序的models.py中定义了模型。如果我那样做,我将重复定义(或部分定义)已经存在于项目级别的模型,这似乎是一个错误和维护问题。
因此,在Django中,我如何在不在应用程序的models.py中重新定义之前,使用项目模式(或其中的部分模式)呢?
提前感谢您的帮助。
3个回答

27

没有必要拥有“项目级别的模型”(或同样的“项目级别的视图”)。你只需要将功能分成单独的应用程序。

假设你正在为一所学校设计一个内部网站。你会有一个处理学生账户的应用程序,另一个生成课程表的应用程序,还有一个内部留言板的应用程序等。每个应用程序都定义自己的模型(没有“项目级别的模型”),但应用程序可以导入其他应用程序的模型(因此留言板帖子可以有一个ForeignKey字段,指向“学生”应用程序中的学生)。

另请参见James Bennett在DjangoCon 2008上的“编写可重用的Django应用程序”演讲 (链接)。


非常有趣和富有教育意义的演讲!詹姆斯还提到,worldonline网站只有settings.pyurls.py。其余的都是Apache Python路径中可重用的应用程序。 - vdboor

9
  • 在 Django 项目中,模型应该只被定义一次

  • 模型需要存在于项目下的一个应用中

  • 你可以通过导入它们来访问其他应用的模型

  • 如果你需要“添加”到现有模型中,可以继承它(参见:多表继承)。这相当简单,但如果你刚开始学习,可能希望稍后再做。


6

Django模型只能存在于应用程序中,而不能存在于项目本身中。默认情况下,manage.py inspectdb输出models.py文件的内容,您需要将其放在正确的位置。

在您的情况下,将整个内容放在一个应用程序中会更容易,然后在需要时将其拆分到合适的位置。

我不确定当前版本的状态如何,但在有models模块的包之前,这表明这是Django应用程序,并且可以放入INSTALLED_APPS列表中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接