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.反序 ...
随机推荐
- WebForms开发方式以及优缺点,来源《ASP.NET MVC企业级实战》
WebForms有以下3种开发方式 1.服务器端控件 2.一般处理程序+HTML静态页+Ajax 3.一般处理程序+HTML模板 WebForms的请求的是具体的某一个文件.具体的一个类,由客户端发送 ...
- CSS-网站导航栏标题之间的分隔符
在一个网页上,尤其是导航栏文字与文字之间,大多数情况下都会有分隔符,也就是文字之间的一个小竖线,这个小小的分隔符,每个网站都有不同的样式,常用的写法就是用标签的边框,这个写法也比较简单,用起来也方便, ...
- import、export使用介绍
import.export使用介绍 ES6提供的import.export方法, 使组件化开发模式迈向新高度.本文来介绍import.export的语法及使用方法. 根据 export 的导出方式,可 ...
- java中System.currentTimeMillis()
System.curentTimeMillis();会产生一个当前的毫秒. 1.计算某个方法的耗时 long curTime = System.currentTimeMillis(); resourc ...
- 使用JNDI+连接池
配置context.xml,在META-INF下新建context.xml,内容如下 <?xml version="1.0" encoding="UTF-8&quo ...
- EasyUI 通过 Combobox 实现 AutoComplete 效果
朋友在做一个web程序,用的EasyUI框架,让我帮忙实现一个自动提示功能.由于之前我也没用过EasyUI框架,就想到了jQueryUI有 AutoComplete 插件,就想直接拿过来用. 但当我将 ...
- cuda中当数组数大于线程数的处理方法
参考stackoverflow一篇帖子的处理方法:https://stackoverflow.com/questions/26913683/different-way-to-index-threads ...
- 团队项目第二阶段个人进展——Day2
一.昨天工作总结 冲刺第二天,基本完成了自己对第二阶段信息发布功能完善的规划 二.遇到的问题 不知道后端数据该如何封装处理 三.今日工作规划 先重新布局发布页面,并添加重置按钮
- [IDEA_1] IDEA 使用指南
1. IDEA 安装与配置 具体细节待补充... 2. 优化编程体验 2.1.1 新建类后自动添加自定义的注释 在主界面使用快捷键 Ctrl + Alt + S 进入 Settings 页面 依次打开 ...
- Custom Voice 操作步骤
首先,准备数据 1.Unicode格式的Transcript 2wav格式语音数据,并打包 好,现在POSTMAN进行api测试. 先拿着订阅密钥(Subscription Key)获取令牌(Toke ...