赞
踩
目录
当模型类写好之后我们通常要进行数据库的迁移才能在数据库中创建表。
输入以下命令表示生成迁移文件。
python manage.py makemigrations 应用名
同步到数据库中:
-
- python manage.py migrate
Django的ORM模块是框架特色功能之一,它把数据表与Python类对应、表字段与类属性对应、类实例与数据记录对应,并将对类实例的操作映射到数据库中。开发者不再需要写SQL代码,可以更加专注地完成业务逻辑,极大地提高了开发效率。
Django中的模型则就是使用到了ORM模块。
Model是Django ORM的核心,它有许多特性(如继承模型、元数据),同时也要遵守一些规则,每个Model都是一个Python类,且通常会包含四个部分:继承自django.db.models.Model、Model元数据声明(Meta内部类)、若干个Field类型的字段以及__str__方法。
Meta类用于定义Model的元数据,即不属于Model的字段,但是可以用来标识它的一些属性。在BaseModel的定义中已经介绍了内部类Meta的使用方法,下面列举一些重要的元选项说明它们的含义以及使用方法。
Model中添加的字段都是Field类型的实例,不同的Field类型可能会支持不同的字段选项,但是,还是有很多字段选项是通用的,即可以用在任何一种Field类型中。这里介绍一些常用且重要的通用字段选项,它们都有对应的默认值,这些字段选项都是可选的,
Model.
get_FOO_display
()方法了。对于每一个设置了的字段,该对象将有一个 方法,其中 是字段的名称。该方法返回字段的"人类可读"值。FOO表示的是字段名,使用时根据不同的字段进行修改即可输出对该字段的描写信息。Django内置的字段类型,按照是否与其他的Model存在关联可以划分为两类:基础字段类型和关系字段类型。关系字段类型只有三个,基础字段类型较多,又可以细分为:字符串、数字、时间和二进制。
Field是所有字段类型的基类,不管是Django内置的字段类型还是自定义的字段类型都需要继承自它。通常对于Field,只需要关注三个方面:映射到数据表的列类型(db_type)、将Python对象映射到数据库(get_prep_value)、从数据库返回Python对象(from_db_value)。
Django定义了三种关系类型用来描述数据库表的关联关系:多对一(ForeignKey)、一对一(OneToOneField)以及多对多(ManyToManyField)。
这种类型在数据库中的体现是外键关联关系,它可以和其他的Model建立关联,同时可以和自己建立关联,用来描述多对一的关系。
它有两个必填的参数。
除了必填的参数之外,ForeignKey还有一些常用的可选参数需要关注。
OneToOneField继承自ForeignKey,在概念上,它类似unique=True的ForeignKey。它与ForeignKey最显著的差别体现在反向查询上:ForeignKey反向查询返回的是一个对象实例列表,而OneToOneField反向查询返回的是一个对象实例。
它与ForeignKey的参数几乎是一样的,只是多了一个可选参数
parent_link:当其设置为True并在继承自另一个非抽象的Model中使用时,那么该字段就会变成指向父类实例的应用,而不是用于扩展父类并继承父类的属性。
Django通过中间表来维护Model与Model之间的多对多关系。这个中间表可以是自己提供的,也可以直接使用Django默认生成的。
它有一个必填的参数to,与ForeignKey和OneToOneField在概念上是一致的,都是用来指定与当前的Model关联的Model。
ManyToManyField还有一些重要的可选参数:
Django Model的继承与Python类的继承是一样的,只是Django要求所有自定义的Model都必须继承自django.db.models.Model。在Django中Model之间有三种继承模型,它们分别是抽象基类、多表继承和代理模型
抽象Model专门设计为被其他的子类继承,它将子Model中通用的元素聚合到一起,以便子Model不用多次重复定义这些通用的部分,且对于修改也只需要操作基类,节省了很多工作量。
关于Model的元数据继承关系,遵循以下几个规则。
在定义抽象基类时,需要注意,如果定义了ForeignKey或ManyToManyField类型的字段,并且设置了related_name或者related_query_name参数,由于继承关系,子类也会拥有同样的字段,所以,就需要想办法让子类中的反向名称和查询名称是唯一的。
Django提供了特殊的语法解决这个问题。
'%(class)s':会替换为子类的小写名称。
'%(app_label)s':会替换为子类所属App的小写名称。
由于Django中每个App的名称都应该是不同的,且每个App中所有Model的名称都应该是不同的,所以,组合在一起的名称就一定是唯一的。
这种继承方式的效果是父Model和子Model都会有数据库表,且Django会自动给子Model添加一个OneToOneField类型的字段指向父Model,而这个字段会成为子Model数据表的主键。
多表继承与抽象基类有一个显著的不同点是Meta的继承:子类不会继承父类的Meta定义。但是,有两个Meta元选项比较特殊:ordering和get_latest_by,它们是会被子类继承的,所以,如果不想让它们影响子类的行为,应该覆盖这两个元选项。
代理模型的使用场景是需要给原始的Model添加一些方法或者修改它的Meta选项,但是不需要修改原始Model的字段定义。为原始的Model创建一个代理,那么对代理模型的增删改的操作都会被保存到原始的Model中。
创建代理模型比较简单,只需要将Meta中的proxy选项设置为True即可。
需要注意,代理模型只能继承自一个非抽象的基类,并且不能同时继承多个非抽象基类。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。