gpt4 book ai didi

python - models.py 中的 models.Model 参数到底指的是什么?

转载 作者:行者123 更新时间:2023-12-01 05:36:24 34 4
gpt4 key购买 nike

我正在看

from django.db import models

class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()

class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()

class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()

这是取自 djangobook.com 的示例,我对 models.Model 参数的内容感到困惑。我知道 models 是一个具有 CharField() 等方法的类,它被继承到这些类中以便创建表列......对吗?但是模型的“模型”部分在哪里呢?这是为了什么?哪里需要它?

您提供的任何类比或解释将不胜感激,因为我一直在互联网上查找,但仍然感到困惑。很抱歉提出了一个无知的问题。

谢谢!

最佳答案

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包的子包,而db包本身又是django包的子包。 Python 点路径与包目录结构平行。

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

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

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

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

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

由于 models 包负责我们可能需要使用的所有子导入,因此我们只需导入该包即可。使用 from 样式导入,我们可以轻松识别代码中使用该包中某些内容的所有位置,因为它始终具有点符号 models.Something。我们不必担心所有这些东西在包中是如何组织的。

了解更多详情,see the Python documentation on packages .

关于python - models.py 中的 models.Model 参数到底指的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18936784/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com