数据库表的对应关系

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. 通过AssemblyResolve事件打包合并exe和dll文件

    使用WPF开发的安装包,在创建快捷方式的时候,需要用到COM程序集Windows Script Host Object Model,引用COM程序集后,会在debug目录生成Interop.IWshR ...

  2. Weka中数据挖掘与机器学习系列之数据格式ARFF和CSV文件格式之间的转换(五)

    不多说,直接上干货! Weka介绍: Weka是一个用Java编写的数据挖掘工具,能够运行在各种平台上.它不仅提供了可以直接用于数据挖掘的软件,还提供了src代码,使用者可以修改源代码,进行二次开发. ...

  3. 每天CSS学习之transform-origin

    在上一篇中,我们学习了如何使用transform来进行2D变形.今天要讲述的transform-origin与这个变形有关. origin翻译过来的意思是原点.开端.transform-origin寓 ...

  4. 戴尔poweredge r730服务器配置及系统安装详解教程

    第一次给服务器安装的是ubantu系统: 首先我们开机进入小型BIOS设置一下RAID,或者进入服务器管理系统,在系统的BIOS中进行RAID设置: 开机后当看到出现< Ctrl > 时按 ...

  5. :状态模式:GumballMachine

    #ifndef __STATE_H__ #define __STATE_H__ #include <iostream> #include<stdlib.h> using nam ...

  6. python中处理.db文件借助navicat

    navicat premium 12  中可以点击“连接” --sqllite 然后选择.db等文件导入 即可再导成..csv等格式.

  7. MyEclipse创建Web项目入门指南

    MyEclipse 在线订购年终抄底促销!火爆开抢>> MyEclipse最新版下载 本教程将指导您创建和部署简单的Hello World Web项目.在本教程中,您将学习如何: 创建一个 ...

  8. Linux(centos) 下curl模拟Http get / post请求 [ curl ]

    一.get请求 curl "http://www.baidu.com"  如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http:// ...

  9. <Dr.Elephant><How to tune ur application>

    Why Dr.Elephant? Most of Hadoop optimization tools out there, but they are focused on simplifying th ...

  10. python-tornado和django优缺点

    Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使用起ORM,做简单的定义,就能自动生成数据库结 ...