1

我在看

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

任何来自您的类比或解释将不胜感激,因为我一直在互联网上寻找并且仍然感到困惑。对不起,无知的措辞问题。

谢谢!

4

1 回答 1

2

我知道模型是一个具有诸如 CharField() 之类的方法的类,它被继承到这些类中以创建表列……对吗?

我相信你在阿尔伯克基走错了路。小写字母models不是一个类,CharField()也不是一个方法,尽管它最终会调用一个特定的方法,__init__()但我们稍后会谈到。

首先看import语句:

from django.db import models

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

值得注意的是,这models不是一个模块,尽管它可能是。models.py如果包中有一个名为 Python 的文件db,那么models它就是一个模块。我们怎么确定?通过仔细阅读 Django 源代码,我们发现它是一个目录,因此是一个包。请参阅此处的源代码

因此,包是包含以下任一目录的目录:其他目录(子包)或 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。我们不必担心所有这些东西在包中是如何组织的。

有关更多详细信息,请参阅有关包的 Python 文档

于 2013-09-22T17:27:00.063 回答