Django之ORM多表关系创建
ORM模型多表逻辑创建:
以图书和作者关系模型为例:
models.py
from django.db import models
'''
一本书只能被一个出版社出版; 一个出版社可以出版多本书;
一个作者可以写多本书; 一个作者唯一对应自己的信息描述
一本书可以有多个作者
id不指定,orm自动创建字段为id的主键: id=models.AutoField(primary_key=True)
'''
# 出版社表
class Publish(models.Model):
publish_name = models.CharField(max_length=40)
publish_addr = models.CharField(max_length=48)

# 书籍表(与出版社多对一,与作者多对对)
class Book(models.Model):
book_name = models.CharField(max_length=40)
book_price = models.DecimalField(max_digits=6, decimal_places=2)
# 参数to外键指向的类(references表),to_filed外键关联条件(on字段)
book_publisher = models.ForeignKey(to='Publish', to_field='id') # 外键多对一,默认级联删除,表中字段默认加了_id(book_publisher_id)

'''
#关联id字段,可以不写,默认就是关联主键
# book_publisher=models.ForeignKey(to='Publish')
# 关联类(表)可以不用关键字to指定,直接写默认会找到(通过字符串反射)
# book_publisher=models.ForeignKey('Publish')
#可取消级联,前提必须设置该字段允许为空
book_publisher = models.ForeignKey(to='Publish', to_field='id', null=True, on_delete=models.SET_NULL)
或者直接设置:db_constraint= False也可设置不级联的效果
'''
author = models.ManyToManyField(to='Author') # 书籍和作者多对多,自动生成一个新表,字段有默认id,两个类名小写加_id,默认表名为:类名小写+_属性名(book_book_author),下文会讲到手动创建这张表的两种方法

# 作者信息表
class AuthorDetail(models.Model):
author_telephone = models.IntegerField(max_length=11)
author_addr = models.CharField(max_length=48)
author_more = models.CharField(max_length=100)

# 作者表(与作者信息表一对一,与书籍表多对多)
class Author(models.Model):
author_name = models.CharField(max_length=12)
author_birth = models.DateField()
author_detail = models.OneToOneField('AuthorDetail',) # 外键一对一(sql中的foreign key + unique)

Tool>Run manage.py Task:makemigrations-->migrate

多对多关系第三张表创建:
以上多对多关系的书籍作者信息表是在书籍中设置多对多ManyToManyField属性系统自动创建的,还有其他两种手动创建的方式:
(1)手动创建方式一
from django.db import models
class Book(models.Model):
book_name = models.CharField(max_length=40)
class Author(models.Model):
author_name = models.CharField(max_length=40)
# 手动创建第三张表
class Book_Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
class Meta:
unique_together = ('book', 'author')
(2)手动创建方式二(手动创建第三张表,无法使用orm提供的add,remove,clear,set方法,但在第三张表有额外信息是常用)
from django.db import models
class Book(models.Model):
book_name = models.CharField(max_length=40)
# ManyToManyField设置属性关联,指定第三张表
author=models.ManyToManyField(to='Author',through='Book_Author',through_fields=('book','author'))
class Author(models.Model):
author_name = models.CharField(max_length=40)
# 手动创建第三张表
class Book_Author(models.Model):
book=models.ForeignKey(to='Book')
author=models.ForeignKey(to='Author')
class Meta:
unique_together=('book','author')
(3)自动创建(第三张表自动创建只含有三字段,可以使用orm提供的方法)
from django.db import models
class Book(models.Model):
book_name = models.CharField(max_length=40)
# ManyToManyField设置属性关联,自动创建第三张表
author=models.ManyToManyField(to='Author')
class Author(models.Model):
author_name = models.CharField(max_length=40)
orm自动创建的第三张表可以直接使用orm提供的add、remove、clear、set方法,手动创建的第三张表不行。
关系表创建使用的类和参数:
(1)一对一:models.OneToOneField()
|
to |
设置要关联的表名(类) |
to='Author' |
|
to_field |
设置要关联的表字段(类属性) |
to_field='id' |
|
on_delete |
同ForeignKey字段级联删除(默认) |
on_delete=models.SET_NULL |
(2)多对一:models.ForeignKey()
|
to |
设置要关联的表 |
|
to_field |
设置要关联的表的字段 |
|
related_name |
反向操作时,使用的字段名,用于代替原反向查询时的'表名_set' |
|
related_query_name |
反向查询操作时,使用的连接前缀,用于替换表名 |
|
on_delete |
当删除关联表中的数据时,当前表与其关联的行的行为 |
(3)多对多:models.ManyToManyField()
|
to |
设置要关联的表 |
|
related_name |
同ForeignKey字段 |
|
related_query_name |
同ForeignKey字段。 |
|
through |
在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名 |
|
through_fields |
设置关联的字段(两张关联表的类名小写元组) |
|
db_table |
默认创建第三张表时,数据库中表的名称。 |
创建表时的元信息:
ORM对应的类里面包含另一个Meta类(上述手动创建第三张表),而Meta类封装了一些数据库的信息。主要字段如下:
|
db_table |
ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。db_table = 'book_model' |
|
index_together |
联合索引。 |
|
unique_together |
联合唯一索引 |
|
ordering |
指定默认按什么字段排序。 ordering = ['pub_date',] 只有设置了该属性,我们查询到的结果才可以被reverse(),否则是能对排序了的结果进行反转(order_by()方法排序过的数据) |
关系表级联删除on_delete
on_delete当删除关联表中的数据时,当前表与其关联的行的行为 :
|
models.CASCADE |
删除关联数据,与之关联也删除 |
|
models.DO_NOTHING |
删除关联数据,引发错误IntegrityError |
|
models.PROTECT |
删除关联数据,引发错误ProtectedError |
|
models.SET_NULL |
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空) |
|
models.SET_DEFAULT |
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值) |
|
models.SET |
删除关联数据, |
Django之ORM多表关系创建的更多相关文章
- Django 通过 ORM 实现表的CRUD
Django 通过 ORM 实现表的CRUD 单表的创建 修改 setting.py 文件 DATABASES = { 'default': { 'ENGINE': 'django.db.backen ...
- 5.Django|模型层--多表关系
多表操作 文件为 ----> orm2 数据库表关系之关联字段与外键约束 一对多Book id title price publish email addr php 人民出版社 北京 pyth ...
- Python学习---django之ORM语法[对象关系映射]180124
ORM语法[对象关系映射] ORM: 用面向对象的方式去操作数据库的创建表以及增删改查等操作. 优点:1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句.快速开发. 2 ...
- Django之ORM跨表操作
Django之ORM表查询及添加记录 一.创建表 - 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-man ...
- Python之路【第三十篇】:django 模型层-多表关系
多表操作 文件为 ----> orm2 数据库表关系之关联字段与外键约束 一对多Book id title price publish email addr 1 php 100 人民出版社 1 ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- python——Django(ORM连表操作)
千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...
- Django【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)
django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); ...
- django之orm单表查询
这几天重新学习了一下django的orm,以此作为记录来分享. Part1:修改配置,生成表 在写数据和查数据之前,首先先得把django配置一下,具体配置如下: 1.先在公共项目的settings中 ...
随机推荐
- MarkDown排版测试
1.标题设置 标题(大标题) 标题(小标题) 标题(一级标题) 标题( 二级标题) 标题(三级标题) 标题(四级标题) 备注:大标题与一级标题一样,小标题与二级标题一样,"#"前无 ...
- java 之 继承 super关键籽 this关键字 final关键字
继承 语法: 使用 extends 来继承 class子类 extends父类{ 子类属性 子类方法 } 继承的特点: 1.子类会把父类所有的属性和方法继承下来,final修饰的类是不可以被继承 ...
- vue2.x学习笔记(二十八)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12682573.html. 生产环境部署 以下大多数内容在你使用vue cli的时候都是默认开启的,仅跟你自定义的构 ...
- 计算5的n次幂html代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- c语言-----劫持自己02
在上一节 c语言-----劫持原理01 已经叙述了劫持原理,下边正式进入劫持实战 1. 需要实现的功能 在c语言中 system("notepad") 可以打开一个记事本 syst ...
- python- 函数高级
函数高级 一.默认参数 1.默认参数概念 默认参数指函数/方法在定义时为形参赋值,对应的形参称为默认参数. 默认参数是一个参数定义期的概念,与调用无关. 2.默认参数的作用 如果参数定义默认参数,在调 ...
- embed git commit hash to assembly
https://stackoverflow.com/a/41200059/3782855 https://github.com/304NotModified/Fody.Stamp
- Shoutem旨在成为React Native移动应用领域的WordPress
近日,Shoutem推出了新的基于React Native的应用构建器,为开发人员提供了移动应用领域的WordPress. \\ Shoutem让开发人员可以使用一个可视化环境快速创建基于React ...
- servlet温故知新
重新学习了一遍servlet-api的文档,做一些记录. 有道云的笔记直接复制到博客上格式会乱,因此直接放上有道云的链接:http://note.youdao.com/noteshare?id=915 ...
- ip地址与运算 ipcalc命令
http://man.linuxde.net/ipcalc 转载于:https://blog.51cto.com/sonlich/2064133