Django项目中的models.py与应用中的models.py

20 投票
3 回答
12823 浏览
提问于 2025-04-15 21:26

我正在学习Django,想搞清楚在项目和应用中使用models.py的区别。根据教程的例子,我应该在应用里定义模型,但当我试着把这个知识应用到我自己的数据库时就遇到了困难。

我拿了一个我常用的数据库(当然是复制的),然后用inspectdb生成了一个Django模型的概念架构。我是在项目层面上做的,然后我以为可以在这个项目的应用里用子架构来写应用。

但是从教程来看,他们是在应用的model.py里定义模型。如果我这样做的话,就会重复定义已经在项目层面的模型(或者其中的一部分),这看起来像是个错误,也会带来维护上的麻烦。

那么,在Django的风格里,我该如何使用项目的架构(或者其中的一部分),而不需要在应用的models.py里重新定义呢?

提前谢谢你。

3 个回答

6

Django的模型只能放在应用里,而不能直接放在项目里。默认情况下,使用 manage.py inspectdb 命令会输出 models.py 文件的内容,接下来你需要自己把它放到合适的位置。

在你的情况下,把所有内容放在一个应用里会更简单,之后再根据需要拆分成多个部分。

我不太确定当前版本的情况,但在之前,如果一个包里有 models 模块,那就说明这是一个Django应用,可以放进 INSTALLED_APPS 列表里。

9
  • 在一个Django项目中,一个模型只需要定义一次。

  • 这个模型必须存在于项目中的某个应用里。

  • 你可以通过导入的方式来访问其他应用里的模型。

  • 如果你想在已有模型的基础上“添加”一些东西,可以通过继承来实现(详细信息请查看:多表继承)。这其实很简单,但如果你刚开始学习,建议先把这个放到后面再学。

27

其实没有必要搞什么“项目级模型”(或者“项目级视图”)。你只需要把功能拆分成不同的应用就可以了。

比如说,你正在为一所学校设计一个内部网站。你可以有一个应用专门处理学生账户,另一个应用用来生成课程表,还有一个应用是内部留言板等等。每个应用都有自己的模型(没有“项目级模型”这个说法),但应用之间可以互相导入对方的模型(比如留言板的帖子可以有一个外键字段,指向“学生”应用里的学生)。

你还可以看看James Bennett在2008年DjangoCon上的“编写可重用的Django应用”演讲

撰写回答