今日内容:
 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. PHP批量导出数据为excel表格

    之前用插件phoexcel写过批量导入数据,现在用到了批量导出,就记录一下,这次批量导出没用插件,是写出一个表格,直接输出 //$teacherList 是从数据库查出来的二维数组 $execlnam ...

  2. Java基础笔记(3) 进制与进制转换

    ---恢复内容开始--- 进制 在一般生活中,我们一直在应用的十进制,就是逢十进一,而今天我们要接触的是,计算机编程常用的进制!首先我们要知道,计算机内部运算采用的是二进制,也就是逢二进制! 1.什么 ...

  3. mongodb基础环境搭建

    一.准备工具 (1)mongodb(https://www.mongodb.com/dr/fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus- ...

  4. 关于ArrayAdapter的getCount()的方法会造成空指针异常的分析

    在继承了ArrayAdapter重新getCount()的方法后,比如 public int getCount() { return 3; } 若在活动中调用setAdapter()的方法前,List ...

  5. 安装 Java 开发工具包JDK(Windows版本)

    前言: 进行java开发,首先要安装jdk,安装完成之后,还需要进行环境变量配置,以下就介绍一下具体步骤 具体步骤: 1.进入官网(https://www.oracle.com/technetwork ...

  6. 【jdk源码2】Objects源码学习

    在学习上一个类TreeMap的时候,提到了这个类,这个类是jdk1.7新增的,里面有很多实用的方法.就是一个工具类,熟悉以后,如果里面有已经实现的方法,那么就不要再去实现了,省时省力省测试. 一.简单 ...

  7. Expo大作战(十七)--expo结合哨兵(sentry)进行错误异常记录

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  8. Supervisor 管理进程,Cloud Insight 监控进程,完美!

    Supervisor 是由 Python 语言编写.基于 linux 操作系统的一款服务器管理工具,用于监控服务器的运行,发现问题能立即自动预警及自动重启等. Cloud Insight 是一款次世代 ...

  9. 大于2t的磁盘分区,并格式化ext4挂载

    1:MBR分区表:(MBR含义:主引导记录) 所支持的最大卷:2T (T; terabytes,1TB=1024GB) 对分区的设限:最多4个主分区或3个主分区加一个扩展分区. 2:GPT分区表:(G ...

  10. SQL Server 从2000复制数据到2008及以上版本的一种方法

    1.通过Linked Servers 执行sql出现错误提示,无法执行复制数据操作. sql: insert into tb_User select from [**.**.*.**].DB.dbo. ...