今日内容:
 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的更多相关文章

  1. day72 关于rbac组件的小部分面试题

    rbac的权限组件   基于角色的权限控制 1.什么是权限? url代表的就是一个权限 2.如何实现权限的控制? 表结构  以我们讲的课的内容为例 菜单表: - title 标题 - icon 图标 ...

  2. python 全栈开发,Day72(昨日作业讲解,昨日内容回顾,Django多表创建)

    昨日作业讲解 1.图书管理系统 实现功能:book单表的增删改查 1.1 新建一个项目bms,创建应用book.过程略... 1.2 手动创建static目录,并在目录里面创建css文件夹,修改set ...

  3. day72 Ajax 第一天

    第一个示例:(i1+i2 ) 前端数据 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  4. Django——认证系统(Day72)

    阅读目录 COOKIE 与 SESSION 用户认证 COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因 ...

  5. CSS3中的动画效果-------Day72

    还记得么,在前面也曾实现过"仅仅用css让div动起来",还记得当时是怎么实现的么,是的,transition,针对的也比較局限,仅仅有旋转角度啊,长宽啊之类的,所以说,与其说是动 ...

  6. 【五一qbxt】day7-2 选择客栈

    停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...

  7. day72作业

    目录 models模型类 路由配置 视图配置 序列化组件配置 基于ModelSerializer类,完成Car资源的单查,群查,单增接口 序列化:显示车名,车的颜色,车的价格,车的海报,车的品牌 反序 ...

  8. day72 bbs项目☞登录注册

    目录 一.表创建及同步 二.注册功能 二.登录页面搭建 一.表创建及同步 from django.db import models from django.contrib.auth.models im ...

  9. day72:drf:

    目录 1.续:反序列化功能(5-8) 1.用户post类型提交数据,反序列化功能的步骤 2.反序列化功能的局部钩子和全局钩子 局部钩子和全局钩子在序列化器中的使用 反序列化相关校验的执行顺序 3.反序 ...

随机推荐

  1. using 和try/catch区别和注意点

    书上解释: using: 在C#和其他托管语言中,没有自动.决定性的析构方式,而是有一个垃圾收集器,它会在未来的某个时刻释放资源.它是非决定性的,因为我们不能确定这个过程在什么时候发生.忘记关闭数据库 ...

  2. CentOS6.8系统安装Node

    环境:CentOS6.8_X64系统 一.到官方下载最新的编译好的安装文件,目前是6.9.4. $>cd /usr/local/src #定位到这个目录,下载的文件会在这个目录#使用wget下载 ...

  3. 韩顺平php从入门到精通

    37 整型细节说明 $a; echo $a; var_dump($a) //NULL 一个数总是要占用内存空间(字节),在php中一个整数一般占用四个字节(与平台相关),一个字节占用8bit php的 ...

  4. 2018-9 Java.lang.StackOverflowError

    问题: Java.lang.StackOverflowError at com.**Logger.**.**.StringFilter.isValueNull(StringFilter.java:81 ...

  5. Windows 自动更新服务恢复

    之前手贱删除了Windows的自动更新服务,命令: SC DELETE Wuauserv 悲剧的是最近中了[永恒之蓝]病毒,很恼人!杀了毒,最后还是得仰仗Windows的补丁来加固系统.于是想通过SC ...

  6. Prometheus Node_exporter 之 System Detail

    System Detail 1. Context Switches / Interrupts type: GraphUnit: shortLabel: CounterContext switches ...

  7. IE8 下面通过滤镜的方式进行图片旋转

    首先,为什么我会提出这样的方式来进行操作呢?原因还是需求导致: 在做项目中,有这样一个需求,在进行网页中图片查看的时候,需要对图片的操作有支持旋转和缩放这些操作,看似这样的网上插件有很多,对!但是对于 ...

  8. 几种模型文件(CDM、LDM、PDM、OOM、BPM)

    概念数据模型 (CDM): 帮助你分析信息系统的概念结构,识别主要实体.实体的属性及实体之间的联系.概念数据模型(CDM)比逻辑数据模型 (LDM)和物理数据模型(PDM)抽象.CDM 表现数据库的全 ...

  9. [Python_7] Python Socket 编程

    0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*- "&q ...

  10. 笔记本键盘开关方法 仅限window系统

    按win键,搜索CMD(命令提示符).右键-以管理员身份运行.关闭笔记本键盘输入:sc config i8042prt start= disabled回车-重启电脑即可.需要重新启用键盘的话,输入:s ...