数据库表的对应关系

1、一对一   #关联字段写在那张表都可以

PS:只要写OneToOneField就会自动加一个id

2、一对多  #关系确立,关联字段写在多的一方

3、多对多   #多对多的关系需要创建第三张表

PS:创建多对多的时候,ORM会自动创建第三张表,这张就是中间表

PS:自动 创建的第三章表命名规则就是app_表名_表名

创建表的对应关系

'''图书管理系统的数据库'''

class Author(models.Model):
'''作家的姓名和年龄'''
# 表的主键可以不写,默认自动生成id
'''id = models.AutoField(primary_key=True) #这个可以不写,省略这句代码'''
name = models.CharField(max_length=32) #姓名
# IntegerField数字类型,无法显示小数点
age = models.IntegerField() #年龄 '''这里表示Author表和AuthorDetail表示一对一的关系,并且关联的字段是id字段,语句里面to表示对应的表,to_field对应的是哪个字段'''
author_detail = models.OneToOneField(to='AuthorDetail',to_field='id') class AuthorDetail(models.Model):
'''作家的地址和电话'''
addr = models.CharField(max_length=128) #地址
phone = models.CharField(max_length=11) #电话 class Book(models.Model):
'''书的信息'''
name = models.CharField(max_length=32) #书名
# 价格类型的尽量用DexcimalFiled类型,这个是可以表示小数点后的数字,decimal_places表示小数点后几位数
price = models.DecimalField(max_digits=5,decimal_places=2) # 书的价格 # 这个是时间日期类型,DatetimeField表示年月日 时分秒,DateField就是年月日
publish_date = models.DateField() # 出版日期 # 一对多的关系外键创立,如果不指定关联的键to_field,默认关联主键
publish = models.ForeignKey(to='Publish') # 多对多的关系,写这一句ORM会自动创建第三张表
authors = models.ManyToManyField(to='Author') class Publish(models.Model):
'''出版社信息'''
name = models.CharField(max_length=32)
# EmailField 类型对应的就是varchar类型,并没有限制
email = models.EmailField()
phone = models.IntegerField()
addr = models.CharField(max_length=32)

多表的新增

一对一的新增 有两种方式
# 第一种方式
'''增加数据一定要注意表的先后顺序,如果字段设置看null=True,即可以为空,就不用注意先后的顺序'''
author_detail = models.AuthorDetail.objects.create(addr = '南京',phone='1234567890')
# author_detail_id 就是表的一个字段 author_detail.id 就是author_detail表的主键字段
author_ = models.AuthorDetail.objects.create(name='lqz2',age=19,author_detail_id=author_detail.id) #最后的author_detail.id也可以协程author_detail.pk,一样的 #第二种方式
# author_detail = 对象
author_detail = models.AuthorDetail.objects.create(addr='东京',phone='1234567890')
# 最后面关联的字段是一个对象,底层就是去对象中把主键取得,然后对应给author_detail
author = models.Author.objects.create(name='lqz2',age=19,author_detail=author_detail) # 多表的修改,就是在操作第三张表 # 对应关系的修改
'''将Author的关联字段中主键是1的修改成author_deatil表中的主键为3的值'''
author = models.Author.objects.filter(pk=1).update(author_detail_id=3) # 用对象修改,对象已经获取了对象的主键,然后将对象直接给author_detai表进行修改
author_detail = models.AuthorDetail.objects.get(pk=3)
author = models.Author.objects.filter(pk=1).update(author_detai=author_detail) '''一对多关系的新增两种方式'''
publish = models.Publish.objects.create(name='南京出版社',email='ddddd',phone='1234567890',addr='南京')
# 这里后面publish=publish,获取对象的主键放入变量,然后增加到对应表的关联列
book = models.Book.objects.create(name='红楼梦',price=12.34,publish_date='2018-07-08',publish=publish)
# 这种写法就是直接定义Book表的 publish_id关联 publish表的主键
book = models.Book.objects.create(name='红楼梦', price=12.34, publish_date='2018-07-08', publish_id=publish.pk) '''多对多的关系的修改'''
# 增加
'''要添加肯定要先查询,所里这里先查询'''
book = models.Book.objects.filter(name='红楼梦').first() #这里需求是给红楼梦的书增加两个作者
# 这样写相当于拿到第三张表,然后将book对象中的红楼梦的id对应上关联表author表中的键值,键值就是add括号里指定的放入第三张表
book.authors.add(1,4) #add内可以传对象,可以传id # 通过对象增加
lqz = models.Author.objects.get(pk=1)
egon = models.Author.objects.get(pk=4)
book.authors.add(lqz,egon) # 删除红楼梦这本书的两个作者
book.authors.clear() #clear 把所有作者删除
book.authors.remove() #传几个参数移除几个,remove里面可以传id也可以穿对象 # 修改 # 修改红楼梦的作者
# 第一种方式:全部删除clear,然后再add进去
# 第二种方式:用set修改,底层原理就是把7拿出来后删除全部的,然后再把关联的id=7的放进去
book.authors.set([7,]) #这里可以传id也可以传对象

(18)模型层 -ORM之msql 多表操作(字段的属性)的更多相关文章

  1. (17)模型层 -ORM之msql 单表的增、删、改、查 及其他操作

    单表操作-增.删.改.查 ret=models.User.objects.filter(id=1)  #这里的结果是一个queryset对象 ret=modles.User.Objects.filte ...

  2. (19)模型层 -ORM之msql 跨表查询(正向和反向查询)

    基于对象的跨表查询 基于对象的跨表查询'''正向和反向查询'''# 正向 ----> 关联字段在当前表中,从当前表向外查叫正向# 反向 ---> 关联字段不在当前表中,当当前表向外查叫反向 ...

  3. Django之模型层第二篇:多表操作

    Django之模型层第二篇:多表操作 一 表关系回顾 ​ 在讲解MySQL时,我们提到,把应用程序的所有数据都放在一张表里是极不合理的. ​ 比如我们开发一个员工管理系统,在数据库里只创建一张员工信息 ...

  4. Django之模型层第一篇:单表操作

    Django之模型层第一篇:单表操作 一 ORM简介 ​ 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数 ...

  5. (21)模型层 -ORM之msql 聚合查询,F和Q(与、或、非查询)、分组查询

    什么是聚合查询,就是使用聚合函数做计算 from django.db.models import Count,Avg,Max,Min   #聚合函数要从模块中导入 from django.db.mod ...

  6. Django的模型层(1)- 单表操作(上)

    一.ORM简介       MTV或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的 ...

  7. 7、Django之模型层第二篇:多表操作

    一 表关系回顾 在讲解MySQL时,我们提到,把应用程序的所有数据都放在一张表里是极不合理的. 比如我们开发一个员工管理系统,在数据库里只创建一张员工信息表,该表有四个字段:工号.姓名.部门名.部门职 ...

  8. 6、Django之模型层第一篇:单表操作

    一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软件,例如mysql.oracle ...

  9. (20)模型层 -ORM之msql 基于双下划线的跨表查询(一对一,一对多,多对多)

    基于对象的跨表查询是子查询 基于双下划线的查询是连表查询 PS:基于双下划线的跨表查询 正向按字段,反向按表名小写 一对一 需求:查询lqz这个人的地址# 正向查询ret = models.Autho ...

随机推荐

  1. learning ddr pagesize calculate

    example: if DDR is 512MB*16*8 COLBITS = 10,  A0-A9 be used for cloumn address. ORG = 16 ,  each bank ...

  2. 跨域 jsonp 和 CORS 资料

    http://mp.weixin.qq.com/s/iAShnqvsOyV-Xd0Ft7Nl2Q HTML5安全:CORS(跨域资源共享)简介...ie67不要想了... http://www.cnb ...

  3. linux:centOs7换源阿里云

    备份: mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载: wget -O /etc/y ...

  4. python3 线程池-threadpool模块与concurrent.futures模块

    多种方法实现 python 线程池 一. 既然多线程可以缩短程序运行时间,那么,是不是线程数量越多越好呢? 显然,并不是,每一个线程的从生成到消亡也是需要时间和资源的,太多的线程会占用过多的系统资源( ...

  5. 【转】caffe数据层及参数

    原文: 要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等, 而一个模型由多个层(layer)构成,每一层又由许多参数组成.所有的参数都定义在caffe.proto ...

  6. ng-table

    需要的文件: angular.js ng-table.js ng-table.css bootrasp.css 注入依赖: var app = angular.module('app', [ 'ngT ...

  7. PE文件 02 导出表

    0x01  导出表结构  导出表是由数据目录表中的第一个成员DataDirectory[0]指出的: typedef struct _IMAGE_DATA_DIRECTORY { DWORD Virt ...

  8. 用servlet实现用户登录案例

    以下实现登录窗口 Login.jsp <!--Login.jsp--> <%@ page language="java" import="java.ut ...

  9. 日志框架elk 搭建

    CENTOS7 安装 NGINX ELK之LOGSTASH ELK之ELASTICSEARCH安装 ELK之KIBANA

  10. IasS,CasS,PasS,SasS的区别

    IasS: (Infrastructure-as-a-Service(基础设施即服务)) 租用的是硬件,服务器,物理机等 CasS: (container as a Service) 容器服务 租用的 ...