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.反序 ...
随机推荐
- python-原型模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明 原型模式关注的是大量相同对象或相似对象的创建问题,意图在于通过复制一个已经存在的实 ...
- java.lang.IllegalArgumentException: findUserById is ambiguous in Mapped Statements collection
这是由于mybatis的mapper xml文件中的id 名字和mybatis内置的方法可能有冲突导致的, 更改xml 的id 名字就可以了!
- C++调用IDL程序的做法(三)
作者:朱金灿 来源:http://blog.csdn.net/clever101 在C++调用IDL程序的做法(二)一文中介绍了如何动态创建IDLDrawWidgetControl的做法.假如我 ...
- 安装ArcGIS Enterprise WebGIS (Portal ArcGIS Server DataStore ) 系统后如何应对网络环境的配置修改
客户往往在部署完ArcGIS WebGIS系统后,由于需要满足业务或者网络管理的要求,需要修改系统的网络环境的配置,下文将从常见的几个场景来讲述如何去应对这些变动. 1.网络IP地址变动 由于在部署W ...
- LeetCode题解之Linked List Cycle
1.题目描述 2.问题分析 使用快慢指针方法,一个快指针,一个慢指针,如果到某个时候,快指针追上了慢指针,则说明有环存在. 3.代码 bool hasCycle(ListNode *head) { i ...
- Ionic模版的使用
Hybird HTML5 App(移动应用开发)之4.Ionic模版的使用 在Windows系统下使Ionic模版,可以使用之前安装的Git工具中的Git Bash.在Mac系统中可以直接使用系统自带 ...
- "System.OutOfMemoryException" exception when you execute a query in SQL Server Management Studio (转自MSDN)
Symptoms When you use Microsoft SQL Server Management Studio (SSMS) to run an SQL query that returns ...
- 通用视图-分开处理GET、POST请求
1.编辑urls.py: url(r'^vmmgmt-vms/$', views.vmmgmt,{'model':models.hvvms,'GET': views.vmmgmt_get_view,' ...
- Remove Rar Password OnLine
How to Remove Rar passwords without any software : One of the most frustrating thing in our digital ...
- .NET Core 获取配置文件appsettings.json 方法
using Abp.Extensions; using Microsoft.Extensions.Configuration; using System; using System.Collectio ...