数据库表的对应关系

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

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

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

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

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

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

创建表的对应关系

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

多表的新增

  1. 一对一的新增 有两种方式
    # 第一种方式
    '''增加数据一定要注意表的先后顺序,如果字段设置看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,一样的
  2.  
  3. #第二种方式
    # 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)
  4.  
  5. # 多表的修改,就是在操作第三张表
  6.  
  7. # 对应关系的修改
    '''将Author的关联字段中主键是1的修改成author_deatil表中的主键为3的值'''
    author = models.Author.objects.filter(pk=1).update(author_detail_id=3)
  8.  
  9. # 用对象修改,对象已经获取了对象的主键,然后将对象直接给author_detai表进行修改
    author_detail = models.AuthorDetail.objects.get(pk=3)
    author = models.Author.objects.filter(pk=1).update(author_detai=author_detail)
  10.  
  11. '''一对多关系的新增两种方式'''
    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)
  12.  
  13. '''多对多的关系的修改'''
    # 增加
    '''要添加肯定要先查询,所里这里先查询'''
    book = models.Book.objects.filter(name='红楼梦').first() #这里需求是给红楼梦的书增加两个作者
    # 这样写相当于拿到第三张表,然后将book对象中的红楼梦的id对应上关联表author表中的键值,键值就是add括号里指定的放入第三张表
    book.authors.add(1,4) #add内可以传对象,可以传id
  14.  
  15. # 通过对象增加
    lqz = models.Author.objects.get(pk=1)
    egon = models.Author.objects.get(pk=4)
    book.authors.add(lqz,egon)
  16.  
  17. # 删除红楼梦这本书的两个作者
    book.authors.clear() #clear 把所有作者删除
    book.authors.remove() #传几个参数移除几个,remove里面可以传id也可以穿对象
  18.  
  19. # 修改
  20.  
  21. # 修改红楼梦的作者
    # 第一种方式:全部删除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. CAD绘制栏杆5.10

    REC绘制一个矩形,(40,40)回车.通过它的中点移动到扶手的中点用移动工具把它往右边稍微移动.在三维图中EXT命令拉伸它,拉到扶手底面.如图选择三维扶手,右击,加栏杆,选择我们绘制的栏杆,单元宽度 ...

  2. 【Java算法】冒泡排序

    package suanfa; public class Maopao { public static void main(String[] args) { // TODO Auto-generate ...

  3. flask下载zip文件报错TypeError

    报错内容:TypeError: make_conditional() got an unexpected keyword argument 'accept_ranges' 报错行自己代码如下: dir ...

  4. 利用FFMPEG命令进行文件分割

    ffmpeg -ss 00:00:00 -i input.mp4 -c copy -t 60 output.mp4 -ss 表示视频分割的起始时间,-t 表示分割时长,同时也可以用 00:01:00表 ...

  5. @ResponseBody中文乱码解决方案

    java web项目,使用了springmvc4.0,用@ResponseBody返回中文字符串,乱码$$ 本以为很简单的问题,不过也找了一个小时. 网上有说这样配置的: <mvc:annota ...

  6. Saiku通过iframe嵌入web页面(六)

    Saiku通过iframe嵌入系统页面 前提: Saiku已安装好,并且配置了数据源,熟练了saiku的基本使用. 一.将整个Saiku嵌入页面 在web项目中,新建index.jsp页面,内容如下: ...

  7. xml解析与生成的学习资料

    xml解析与生成的学习资料:http://blog.csdn.net/u012325167/article/category/6129813 ----------------------------- ...

  8. 多态概念,C++

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. 二叉排序树,Binary_Sort_Tree,C++完整实现

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  10. 上传本地代码到GitHub上

    由于经常忘记Git的相关代码,百度多了自然不耐烦,干脆自己写个简单的博客记录一下代码及流程了...... 1.在GitHub上新建一个仓库: 2.创建完后在仓库左上角的ssh上copy一下地址: 3. ...