day72
今日内容:
1 创建多表模型(详情见代码)
from django.db import models # Create your models here. class Publish(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
email = models.EmailField(null=True) class AuthorDetail(models.Model):
id = models.AutoField(primary_key=True)
sex = models.IntegerField()
phone = models.CharField(max_length=11) class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
author_details = models.OneToOneField(to='AuthorDetail', to_field='id') class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish = models.ForeignKey(to='Publish', to_field='id')
authors = models.ManyToManyField(to=Author)
#用了OneToOneField和ForeignKey,模型表的字段,后面会自定加_id
# ManyToManyField会自动创建第三张表
# *************重点
# 一对一的关系:OneToOneField
# 一对多的关系:ForeignKey
# 多对多的关系:ManyToManyField
2 添加表记录
1 一对多新增
-两种方式:
-publish=对象
-publish_id=id
# 一对多增
# 方式一
publish = models.Publish.objects.filter(name='北京出版社').first()
res= models.Book.objects.create(name='红楼梦',price=55.67,publish=publish)
# 方式二
res = models.Book(name='三国演义',price=73.89)
res.publish_id=2
res.save()
# 方式三
res = models.Book.objects.create(name='西游记',price=65,publish_id=4)
2 一对多删除:同单表删除
res = models.Publish.objects.filter(id=4).delete()
#由于Publish表与Book表的关系是一对多,所以一旦删除Publish表中的记录,会级联删除Book表中的记录
res = models.Book.objects.filter(name='西游记',price=65).delete()
3 一对多修改:两种方式,可以传对象,可以传id
4 一对一跟一对多一样
# 一对多修改
# 方式一
publish = models.Publish.objects.filter(name='东京出版社').first()
res = models.Book.objects.filter(publish=publish).update(price=99)
# 方式二
res = models.Book.objects.filter(publish_id=3).update(price=58)
# 方式三
res = models.Book.objects.filter(publish_id=3).first()
res.price = 73.59
res.save()
5 多对多:
-add ----->可以传对象,可以传id,可以传多个
-remove ----->可以传对象,可以传id,可以传多个
-clear ---->没有参数
-set ----->跟上面不一样,必须传列表,列表里面可以是对象,可以是id
# 多对多增
# 方式一
book = models.Book.objects.filter(name='红楼梦').first()
user1 = models.Author.objects.filter(id=1).first()
user2 = models.Author.objects.filter(id=2).first()
book.authors.add(user1, user2)
# 方式二
book = models.Book.objects.filter(name='三国演义').first()
book.authors.add(2,3) # 多对多删除
# 方式一
book = models.Book.objects.filter(name='三国演义').first()
user = models.Author.objects.filter(id=3).first()
book.authors.remove(user)
# 方式二
book = models.Book.objects.filter(name='红楼梦').first()
book.authors.remove(3) # clear
book = models.Book.objects.filter(name='红楼梦').first()
book.authors.clear() # set
book = models.Book.objects.filter(name='红楼梦').first()
book.authors.set([1,2,3])
3 基于对象的跨表查询
1 一对一
正向:正向查询按字段
反向:反向查询按表名小写
# 一对一
# 正向
author = models.Author.objects.filter(id=1).first()
res = author.author_details
print(res.phone)
# 反向
authordetail = models.AuthorDetail.objects.filter(id=3).first()
res = authordetail.author
print(res.addr)
2 一对多
正向:正向查询按字段
反向:反向按表名小写_set.all()
# 一对多
# 正向
book = models.Book.objects.filter(id=2).first()
res = book.publish
print(res)
# 反向
publish = models.Publish.objects.filter(name='北京出版社').first()
res = publish.book_set.all()
print(res)
3 多对多
正向:正向查询按字段
反向查询:反向按表名小写_set.all()
# 多对多
# 正向
book = models.Book.objects.filter(id=2).first()
res = book.authors.all()
print(res)
# 反向
author = models.Author.objects.filter(id=1).first()
res = author.book_set.all()
print(res)
4******基于对象的查询,多次查询(子查询)
publish = models.Publish.objects.filter(id=1).first()
book = publish.book_set.filter(name='红楼梦').first()
author = book.authors.filter(name='郑棒').first()
authordetail = author.author_details
print(authordetail.phone)
4 基于双下划线的跨表查询
-连表查询
-一对一双下划线查询
-正向:按字段,跨表可以在filter,也可以在values中
res = models.Author.objects.filter(name='郑棒').values('author_details__phone', 'author_details__sex')
print(res)
-反向:按表名小写,跨表可以在filter,也可以在values中
res = models.AuthorDetail.objects.filter(author__name='郑棒').values('phone','author__addr')
print(res)
day72的更多相关文章
- day72 关于rbac组件的小部分面试题
rbac的权限组件 基于角色的权限控制 1.什么是权限? url代表的就是一个权限 2.如何实现权限的控制? 表结构 以我们讲的课的内容为例 菜单表: - title 标题 - icon 图标 ...
- python 全栈开发,Day72(昨日作业讲解,昨日内容回顾,Django多表创建)
昨日作业讲解 1.图书管理系统 实现功能:book单表的增删改查 1.1 新建一个项目bms,创建应用book.过程略... 1.2 手动创建static目录,并在目录里面创建css文件夹,修改set ...
- day72 Ajax 第一天
第一个示例:(i1+i2 ) 前端数据 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- Django——认证系统(Day72)
阅读目录 COOKIE 与 SESSION 用户认证 COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因 ...
- CSS3中的动画效果-------Day72
还记得么,在前面也曾实现过"仅仅用css让div动起来",还记得当时是怎么实现的么,是的,transition,针对的也比較局限,仅仅有旋转角度啊,长宽啊之类的,所以说,与其说是动 ...
- 【五一qbxt】day7-2 选择客栈
停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...
- day72作业
目录 models模型类 路由配置 视图配置 序列化组件配置 基于ModelSerializer类,完成Car资源的单查,群查,单增接口 序列化:显示车名,车的颜色,车的价格,车的海报,车的品牌 反序 ...
- day72 bbs项目☞登录注册
目录 一.表创建及同步 二.注册功能 二.登录页面搭建 一.表创建及同步 from django.db import models from django.contrib.auth.models im ...
- day72:drf:
目录 1.续:反序列化功能(5-8) 1.用户post类型提交数据,反序列化功能的步骤 2.反序列化功能的局部钩子和全局钩子 局部钩子和全局钩子在序列化器中的使用 反序列化相关校验的执行顺序 3.反序 ...
随机推荐
- Angular echarts图表自适应屏幕指令
关于echarts图表自适应问题 一.引入js文件 1. 在html页面引入angular.min.js文件 2. 在html页面引入echarts.min.js文件 3. 在html页面引入app. ...
- Tomcat启动报错:org.apache.catalina.LifecycleException: Failed to start component...java.util.zip.ZipException: error in opening zip file
1.项目环境 IntelliJ IDEA2018.1.6 apache-tomcat-8.0.53 基于springboot开发的项目 maven3.5.3 2.出现问题 从svn同步下项目 启动to ...
- layer弹出框确定前验证:弹出消息框(弹出两个layer)
作者QQ:1095737364 QQ群:123300273 欢迎加入! layer 弹出框中经常遇到要弹出表单进行修改数据, 因此在弹出框中的表单需要验证数据, 就需要在弹出一个layer, 默认的设 ...
- H5 canvas 实现飞机大战游戏
首先看几张效果图: 上面三张图分别对应游戏的三种状态 ready,play,pause.体验一下 先介绍一下canvas 画图的原理,在这个游戏中的背景,飞机,子弹以及飞机被击中爆炸的效果都是一张张的 ...
- leveldb源码分析--BloomFilter
bloomfilter是leveldb中的一大性能利器,所以为了文章的表现完整性这里新启这么一篇文章.leveldb中的bloomfilter的实现在bloom.cc中,是一个较为简单的实现,所以就不 ...
- MySql服务的启动和停止
1.启动:net start mysql; 2.停止:net stop mysql.
- 使用动态跟踪技术SystemTap监控MySQL、Oracle性能
[IT168 技术]本文根据吕海波2018年5月11日在[第九届中国数据库技术大会]上的演讲内容整理而成. 讲师介绍: 吕海波,美创科技研究员,ITPUB管理版版主.出版技术书籍<Oracle内 ...
- jquery 比较全面的API中文版地址
jquery中文API地址 里面有对各个版本的jquery的属性.方法等都有全面的介绍加例子,值得拥有!
- sshpass 绕过ssh 密码交互式验证
经常我们使用脚本登入服务器的时候,如果使用ssh 命令,经常会提示密码输入,我们不得不手动输入密码,因为ssh 没有 密码的选项. 为了能绕过交互式验证,我们使用sshpass命令解决这个问题: 1. ...
- django -- Celery实现异步任务
1. 环境 python==2.7 djang==1.11.2 # 1.8, 1.9, 1.10应该都没问题 celery-with-redis==3.0 # 需要用到redis作为中间人服务(Bro ...