模型.py中的models.Model参数指的是什么?

2024-04-26 06:06:06 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
1条回答
网友
1楼 · 发布于 2024-04-26 06:06:06

I get that models is a class with methods such as CharField(), which is being inherited into these classes in order to create table columns...right?

我相信你在阿尔伯克基走错了弯。小写models不是一个类,CharField()也不是一个方法,尽管它最终确实调用了一个名为__init__()的特定方法,但我们稍后会讨论这个问题。在

首先,看看import语句:

from django.db import models

小写models这里是一个包,意味着它是一个包含__init__.py文件的目录。具体地说,它是包db的一个子包,它本身就是django包的子包。Python虚线路径与包目录结构平行。在

这里值得注意的是,models不是一个模块,尽管它可能是。如果在db包中有一个名为models.py的Python文件,那么models将是一个模块。我们怎么知道呢?通过仔细阅读Django源代码,我们发现它是一个目录,因此是一个包。See the source code here。在

因此,包是包含其他目录(子包)或python文件(模块)的目录。类定义在模块中定义。那么,如果Model类是一个包而不是一个模块,它是如何从models导入的呢?在

这是可能的,因为models包中的__init__.py文件导入了Model类。Model类定义实际上位于base模块中,是的,models包中的base.py文件。在

现在,对于CharField()。在Python中,类实例化使用函数表示法。定义自定义Model类时,数据库字段是从模型的类属性创建的。在Book模型中,title是一个类属性,从CharField类实例化。当它被实例化时,调用CharField方法__init__()。在

这里是一个很好的地方来指出为什么有方便的包装使进口更方便。CharField类在models包的fields子包中定义,Django的许多其他字段类也在那里定义。与models包中的__init__.pybase子模块导入Model类类似,它还从fields子模块导入所有字段。在

由于models包负责我们可能需要使用的所有子导入,所以我们可以直接导入该包。使用from样式的导入,我们可以很容易地识别代码中使用该包中的某些内容的所有位置,因为它总是有点符号models.Something。我们不必担心这些东西是如何组织在包裹里的。在

有关详细信息,see the Python documentation on packages。在

相关问题 更多 >