我在看
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参数感到困惑。 我得到的模型是一个包含CharField()等方法的类,它被继承到这些类中以创建表列...对吗?但模型的“模型”部分在哪里呢?这是为了什么?需要在哪里?
任何来自你的类比或解释都会受到赞赏,因为我一直在网上看,但仍然感到困惑。 对于无知的措辞问题感到抱歉。
谢谢!
答案 0 :(得分:2)
我得到的模型是一个带有CharField()方法的类,它被继承到这些类中以创建表列...对吗?
我相信你在阿尔伯克基走错了路。小写models
不是一个类,CharField()
不是一个方法,虽然它最终会调用一个名为__init__()
的特定方法,但我们会稍微讨论一下。
首先,查看import语句:
from django.db import models
这里的小写models
是一个包,这意味着它是一个包含__init__.py
文件的目录。具体来说,它是包db
的子包,它本身是django
包的子包。 Python虚线路径与包目录结构平行。
值得注意的是models
不是一个模块,尽管它可能已经存在。如果models.py
包中有一个名为db
的Python文件,那么models
就是一个模块。我们怎么知道?通过仔细阅读Django源代码,我们发现它是一个目录,因而是一个包。 See the source code here。
因此,包是包含以下内容的目录:其他目录(子包)或python文件(模块)。类定义在模块中定义。那么,Model
类是如何从models
导入的,如果它是包而不是模块?
这是可能的,因为__init__.py
包中的models
文件会导入Model
类。 Model
类定义实际上存在于base
模块中,是base.py
包中的models
文件。
现在,对于CharField()
。在Python中,类实例化使用函数表示法。定义自定义Model
类时,将根据模型的类属性创建数据库字段。在Book
模型中,title
是一个类属性,从CharField
类实例化。实例化后,将调用CharField
方法__init__()
。
这里有一个很好的地方可以指出为什么让包装变得更方便更方便。 CharField
类在fields
包的models
子包中定义,Django的许多其他字段类也在那里定义。与__init__.py
包中从models
子模块导入Model
类的base
类似,它也会导入fields
子模块中的所有字段。模块。
由于models
包处理我们可能需要使用的所有子导入,我们可以只导入该包。使用from
样式导入,我们可以轻松识别代码中我们使用该包中某些内容的所有位置,因为它始终具有点符号models.Something
。我们不必担心包装中的所有内容是如何组织的。