models.py中的models.Model参数究竟是指什么?

时间:2013-09-21 19:36:00

标签: python django

我在看

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()等方法的类,它被继承到这些类中以创建表列...对吗?但模型的“模型”部分在哪里呢?这是为了什么?需要在哪里?

任何来自你的类比或解释都会受到赞赏,因为我一直在网上看,但仍然感到困惑。 对于无知的措辞问题感到抱歉。

谢谢!

1 个答案:

答案 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。我们不必担心包装中的所有内容是如何组织的。

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