ORM------多表操作
上面介绍了单表操作 下面就好比我们的sql语句这只能满足于我们的一些简单的操作不能适应我们更多的需要 所以我们需要用到更多的需求来进行我们的关系的建立以及查找
其实ORM语句就对应着我们的sql语句 表与表之间的关系 无非就是你的
一对一 :好比老公和媳妇 这就是一对一
多对一 :好比出版社和出版的书籍
多对多:好比作者和书籍一本书可以有多个作者联合出版 一个作者可以出版好几本书
这三种关系
一:创建表
创建一对一的关系:OneToOne("要绑定关系的表名")
创建一对多的关系:ForeignKey("要绑定关系的表名")
创建多对多的关系:ManyToMany("要绑定关系的表名") 会自动创建第三张表
并且这个orm和我们的sql虽然是对应的语句最后会通过pymsql进行翻译成对应的sql语句 但是创建的时候还是会有一些细微的差距的 ,比如你orm语句在创建对应的表的类语句的时候并不是和sql一样先创建主表再创建子表的 ,只要你这一次创建的主表和子表都依次建立 那么就不论谁在前 谁在后
from django.db import models # Create your models here. class Book(models.Model):
# 不写id的时候数据库会自动给你增加自增id
name = models.CharField(max_length= 30)
price = models.DecimalField(max_digits=6,decimal_places=3) pub_date = models.DateField()
# 一个出版社有多本书,关联字段要写在多的一方
# publish是实例对象关联的出版社对象 # 不用命名为publish_id,因为django为我们自动就加上了_id
publish = models.ForeignKey(to = 'Publish',to_field = 'id', on_delete = models.CASCADE) # 这个是orm创建外键的语法
#to = 后面跟的是你要绑定的主表的名字 to_dield 后面跟的是你要绑定的主表的字段 on_delete = models.CASCADE代表你删除的时候可以任意的删除 不会因为绑定了关系而无法删除 authors = models.ManyToManyField(to = 'Author') #这个是自动就帮我们创建了多对多的这个关系的表 def __str__(self):#__str__方法使用来吧对象转换成字符串的,你返回啥内容就打印啥
return self.name class Publish(models.Model):
name = models.CharField(max_length = 30) emial = models.CharField(max_length = 40) addd = models.CharField(max_length=30) class Author(models.Model):
name = models.CharField(max_length = 30)
age = models.IntegerField()
# ad = models.OneToOneField(to = 'AuthorDetail', to_field = 'id',on_delete = models.CASCADE)
ad = models.OneToOneField(to = 'AuthorDetail', to_field = 'id', on_delete = models.CASCADE) #这个是建立一对一的关系 class AuthorDetail(models.Model):
gf = models.CharField(max_length = 30)
tel = models.CharField(max_length = 30)
添加信息:
当你对表内添加信息的时候就和sql一样了 你需要对表中的数据进行先对主表进行添加,因为只要主表有了数据你的子表才能选择内容进行选择
author = Author.objects.create(name = '赵云',addr = '中国',Gf_id = 1 ) #这个是会报错的 因为你的外键的列没有能找到对应的表中的值 因为你的主表内没有信息
第一种添加方式(推荐):
book = Book.objects.create(name = '三重门',ptice = 65.4,pub_date = '2003-06-04',publish_id =1 )
直接就是对你的表的内容进行添加
第二种方式可以筛选添加:
# 一对多的添加方式2 # publish必须接受一个对象
获取你的主表的对象 然后通过对象来找到主表的id
可以当作条件来筛选设置
pub = Publish.objects.filter(name = '南方出版社') .first() # 筛选你的name是南方出版社的条件然后找到这个内容
book = Book.objects.create(name = '走西口',ptice = 76.8,pub_date='1997-06-08',publish_id=pub.id) #这个时候个根据你求出的出版社的对象来设置id return HttpResponse(book.name)
book = Book.objects.create(name = '说不清道不尽',ptice = 100,pub_date='2017-08-21',publish = pub) #也可指直接通过对象复制因为你的publish通过orm会自动设置的
book.save()
有人好奇publish=主表对象怎么就可以找到id了 首先你的publish orm再解析语句的时候会自动加上_id这个时候你加不加都可以 然后后面的是对象它会自动的找对象的id
book = Book.objects.create(name = '说不清道不尽',ptice = 100,pub_date='2017-08-21',publish = pub) #也可指直接通过对象复制因为你的publish通过orm会自动设置的
很多人会好奇这是怎么找到的下面的例子你看看: 既然找到了对象那么再找对象的id不就是轻而易举了吗 # book.publish # 与这本书籍关联的出版社对象
# print(book.publish)
# print(book.publish_id)
add和set就是通过你的子表和主表关联的字段的名字来进行的使用add和set的因为通过你在子表设置的关系字段名可以找到关系表然后 利用子表调用关系字段名进行设置 就可以添加到关系表内了
添加多对多关系:.add()
add()添加
book = Book.objects.create(name = '人民心论',ptice = 324,pub_date='2000-06-07',publish_id =1 )
ale = Author .objects.filter(name = '赵云').first() #先求出姓名是赵云的作者的名字的对象
zy = Author.objects.filter(name = '赵云龙').first() #再求出姓名是赵云龙的作者的名字的对象 book.authors.add(*[zy,ale]) #通过add来进行对象的添加 设置这个多对多的设置 这个是在你的关系表中创建关系 *是打散迭代添加
#这个但就是对象掉用字段然后直接就创建了关系 因为你的关系表就是类Book中的authors创建的
这个add()添加首先你要找到你的 book这本书指定的的对象然后用add指定这个对象添加
也可以得到所有的对象然后迭代添加到你的信息中
book = Book.objects.filter(name = '三重门').first() #得到书本是三重门的对象
author_list = Author.objects.all() #得到所有的作者对象
book.authors.add(*author_list) #把所有的作者都打散添加给三重门关系表
book.authors.add(1,2) #把book对象的关系设置为和作者1,2关联起来
book.authors.add(*[1,2]) #也可以设置这样的打散关联
set添加:
set添加一次添加多个 比如你要添加的是多个信息就使用set依次把你的信息清空再添加
book_obj.authors.remove()
# 将某个特定的对象从被关联对象集合中去除。 ====== book_obj.authors.remove(*[])
book_obj.authors.clear()
#清空被关联对象集合
book_obj.authors.
set
()
#先清空再设置
set和add区别 add是追加 而set是清空后再添加 (可添加多个) 如果你现在一本书的作者有一个老王 那么你想添加个老赵 这个时候只能用add因为add是追加 set是把以前的清空再追加 如果用set需要写上两个作者
解除绑定的关系:
解除你所设置的表的关系的信息就好比作者和书籍之类的设置要用remove()
清空所有的信息绑定clear()
remove()移除绑定 一个一个的解除:
book = Book.objects.filter(name='三重门').first() # 得到书本是三重门的对象
ale = Author.objects.filter(name='赵云').first() # 先求出姓名是赵云的作者的名字的对象
zy = Author.objects.filter(name = '赵云龙').first() #再求出姓名是赵云龙的作者的名字的对象
book.authors.remove(ale)#解除作者对象是ale和三重门的绑定
这种一个一个的移除有点浪费时间 我们可以用clear()清除所有的绑定
book.authors.clear() #移除所有的作者对象是和三重门的绑定
******
# print(book.publish) # 与这本书籍关联的出版社对象
# print(book.authors.all()) # 与这本书关联的作者对象queryset对象集合<QuerySet [<Author: Author object (1)>, <Author: Author object (2)>]>
print(book.authors) #first.Author.None 因为是多对多你的 对象可能有很多一个无法求出 所以必须用all() print(type(book.authors)) #类型是class
print(book.authors) #first.Author.None 因为是多对多你的 对象可能有很多一个无法求出 所以必须用all() print(type(book.authors)) #类型是class
基于对象跨表查询(子查询): 切记 下面是的基于对象的查询
一对多:
正向查询:关联属性在book表中,所以book对象找关联出版社对象,正向查询
反向查询:关联属性在book表中,所以publish对象找关联书籍,反向查询
按字段:.publish
book ------------------ > publish
<--------------------
按表名小写_set.all() publish_obj.book_set.all()
set.all()主表可以通过子表的表名小写之后来找到自己所需要的信息
print(book.publish.name) #查询book对象的出版社的名字 根据字段来查找
print(book.publish) #Publish object (1) 首先你通过book.publish 找到了关联的报社的这个对象 然后找到了名字 上面就好比这样:
book = Book.objects.filter(name = '三重门').first() #先找到这个三重门的对象
publish_id = book.publish_id #找到这个三重门的关联的出版社的id
publish = Publish.objects.filter(id = publish_id).first() # 通过这个id找到这个出版社的对象
print(publish.name)
书籍对象_set.add()
打印所有的大中国出版社出版的书籍:
publish = Publish.objects.filter(name = '大中国出版社').first()
book1 = Book.objects.filter(publish_id = publish)
for i in book1:
print(i.name) 简便写法用set()
publish = Publish.objects.filter(name = '大中国出版社').first()
ret = publish.book_set.all() #用任意书籍队形调用_set.all() 就可以求出所有的这个出版社的出版书籍
for i in ret:
print(i.name)
多对多:
多对多:
正向查询:关联属性在book表中,所以book对象找关联作者集合,正向查询
反向查询:关联属性在book表中,所以author对象找关联书籍,反向查询
正 按字段:.authors.all()
book ------------------------- > author
<-------------------------
反 按表名小写_set.all() author_obj.book_set.all()
通过你的子表写小写之后调用set来查找
set.all()主表可以通过子表的表名小写之后来找到自己所需要的信息
这个是求书籍说不清道不尽的作者 book = Book.objects.filter(name='说不清道不尽').first() # 得到书本是三重门的对象
aut = book.authors.all().values('name')
print(aut)
因为你的book.authors就能通过你的字段找到你所有的作者的关联的对象那么字然也能找到你的 所有的对象
这里的_set.all()也只是可以通过子表中的任意一个对象都可以找到主表所需要的信息
查找作者赵云出版所有的书籍
book = Book.objects.filter(name='说不清道不尽').first() # 得到书本是三重门的对象
al = Author.objects.filter(name = '赵云').first() ret = al.book_set.all().values('name') print(ret)
一对一:
正向查询:关联属性在author表中,所以author对象找关联作者详细信息对象,正向查询
反向查询:关联属性在author表中,所以authordetail对象找关联作者对象,反向查询
正 按字段:.Gf 这个Gf是你的一对一的字段
author ------------------------- > authordetail
<-------------------------
反 按表名小写 authordetail_obj.author
主表可以通过子表的表名小写之后来找到自己所需要的信息
查找作者赵云的女朋友:
al = Author.objects.filter(name = '赵云').first() #通过你的 子表内的关联的字段找到你的 作者关联的Gfirend表中的对象的名字
print(al.Gf.name)
是封装了你的子表小写之后的对象然后调用set或者内容来进行的求取
ORM------多表操作的更多相关文章
- day59——orm单表操作
day59 orm单表操作 对象关系映射(object relational mapping) orm语句 -- sql -- 调用pymysql客户端发送sql -- mysql服务端接收到指令并执 ...
- 17-2 orm单表操作和多表操作
参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 一 ORM单表操作 1 增删改查 1. 查询 1. 查所有 models.Publisher. ...
- Django框架06 /orm多表操作
Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...
- Django框架05 /orm单表操作
Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...
- day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询
目录 1.URL别名&反向解析 2.URL分发&命名空间 3.ORM多表操作-修改 4.ORM多表操作-查询 4.1 基于对象的跨表查询 4.2 基于双下划线的跨表查询 4.3 聚合查 ...
- Django ORM 多表操作
目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...
- python——Django(ORM连表操作)
千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...
- Django ORM多表操作
多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ...
- ORM 多表操作查询及增删改查
------------------------------------------只有对前途乐观的人,才能不怕黑暗,才能有力量去创造光明.乐观不是目的,而是人生旅途中的一种态度. 多表操作 创建模型 ...
- 09 ORM 多表操作,创建表,添加记录
1.数据库表关系 1.一对多 为什么需要,重复字段太多 一对多关系表 Book id title price publish_id 1 python 100 1 2 php 200 2 3 go 10 ...
随机推荐
- jquery的animate关于background-position属性
jQuery 的 animate 虽然能直接使用 CSS 的方式来进行动画,但有些属性其实是不支持的,例如:background-position. 谷歌支持 background-position- ...
- django notes 七:Using Forms
form 也没什么可说的,我只给一个例子大家就懂了 form model from django import forms class UserForm(forms.Form): username = ...
- Android MediaPlayer 常用方法介绍
Android MediaPlayer 常用方法介绍 方法:create(Context context, Uri uri) 解释:静态方法,通过Uri创建一个多媒体播放器. 方法:create(Co ...
- 事务实现,redo,undo,锁
事务(Transaction)是数据库区别于文件系统的重要特性之一.在文件系统中,如果你正在写文件,但是操作系统突然崩溃了,这个文件就很有可能被破坏.当然,有一些机制可以把文件恢复到某个时间点.不过, ...
- *2_3_5_加入reference model
摘自:http://book.2cto.com/201408/46009.html 在2.1节中讲述验证平台的框图时曾经说过,reference model用于完成和DUT相同的功能. referen ...
- Lineare Algebra
Grundlegendes Wort: 矩阵列:Das Spalte von der Matrix 行列式:Die Determinante 对角矩阵:Die diagonal Matrix 逆矩阵: ...
- 用canvas和原生js写的一个笨鸟先飞的小游戏(暂时只有一个关卡)
其中一个画布背景是一张图片,还有小鸟,两个管子的图片.暂时不知道怎么附上去就不添加了.这里只有源代码,css和js都是在html写着的,感觉比他们的容易吧,hah <!DOCTYPE html& ...
- 基础爬虫,谁学谁会,用requests、正则表达式爬取豆瓣Top250电影数据!
爬取豆瓣Top250电影的评分.海报.影评等数据! 本项目是爬虫中最基础的,最简单的一例: 后面会有利用爬虫框架来完成更高级.自动化的爬虫程序. 此项目过程是运用requests请求库来获取h ...
- python之virtualenv的简单使用
什么是virtualenv? virtualenv可以创建独立Python开发环境,比如当前的全局开发环境是python3.6,现在我们有一个项目需要使用django1.3,另一个项目需要使用djan ...
- xcopy命令的其他参数
xcopy /s /e /h "c:\123" "D:\123\" 后面多一个斜杠,让程序知道是目录 以下还给您提供了 xcopy 命令的其他参数: /A 仅复 ...