一.多表的创建
from django.db import models # Create your models here. class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() au = models.OneToOneField(to='AuthorDetail',to_field='id') # 一对一表的创建 class AuthorDetail(models.Model): id = models.AutoField(primary_key=True) address = models.CharField(max_length=32) tel = models.CharField(max_length=11) class Publish(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) addr = models.CharField(max_length=64) class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32) publisher = models.ForeignKey(to='Publish',to_field='id',on_delete=models.CASCADE)
# 一对多表的创建 authors = models.ManyToManyField(to='Author') # 多对多表的创建 (方法一) 自行创建第三张表 # # class Book2Author(models.Model): # 多对多表的创建 (方法二) ORM的一些功能不能使用 # id = models.AutoField(primary_key=True) # book = models.ForeignKey(to='Book',to_field='id') # author = models.ForeignKey(to='Author',to_field='id')
① 创建一对一关系字段时的一些参数
to
设置要关联的表。
to_field
设置要关联的字段。
on_delete
同ForeignKey字段。
② 创建一对多关系字段时的一些参数 to 设置要关联的表 to_field 设置要关联的表的字段 related_name 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。 related_query_name 反向查询操作时,使用的连接前缀,用于替换表名。 on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。
③ 多对多的参数:
to
设置要关联的表
related_name
同ForeignKey字段。
related_query_name
同ForeignKey字段。
through
在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过
through来指定第三张表的表名。
through_fields
设置关联的字段。
db_table
默认创建第三张表时,数据库中表的名称。
④ .创建表时的一些元信息设置 ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下: class Author2Book(models.Model): author = models.ForeignKey(to="Author") book = models.ForeignKey(to="Book") class Meta: unique_together = ("author", "book") db_table ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。 index_together 联合索引。 unique_together 联合唯一索引。 ordering 指定默认按什么字段排序。 只有设置了该属性,我们查询到的结果才可以被reverse()。 创建表时的一些元信息设置
⑥ 关于on_delete
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE
删除关联数据,与之关联也删除
models.DO_NOTHING
删除关联数据,引发错误IntegrityError
models.PROTECT
删除关联数据,引发错误ProtectedError
models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
models.SET
删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
关于on_delete参数
注意事项: 1. 表的名称myapp_modelName,是根据 模型中的元数据自动生成的,
也可以覆写为别的名称
2. id 字段是自动添加的
3. 对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名
4.这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,
要注意的是Django 会根据settings 中指定的数据库类型来使用相应的SQL 语句。
5. 定义好模型之后,你需要告诉Django _使用_这些模型。
你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py所在应用的名称。 6.外键字段 ForeignKey 有一个 null=True 的设置(它允许外键接受空值 NULL),
你可以赋给它空值 None 。 7. 咱们的表里面包含了一对一、一对多、多对多的关系,我们基于这几个表来练习,
将来无论有多少张表,都逃脱不了这三个关系,操作起来都是一样的。
二. 添加表记录(关联表)
1.多对一表记录的添加
2.一对一表记录的添加 (与多对多相同)
3.多对多表记录的添加
三.基于对象的跨表查询
正向通过 连接字段 ,反向 通过 表
1. 一对一 查询
2. 一对多 查询
3.多对多 查询