一、表关系的实现:

  一对一:OneToOne(外键+唯一键)

xxx = models.OneToOneField('关联的表',on_delete=models.CASCADE)

    外键和一对一关系的时候需要加 on_delete 选项,此参数为了避免两个表里的数据不一致问题,不然会报错! 使用 CASCADE 表示级联删除:关联表中的数据删除了,这张表中对应的数据也会删除

  一对多:OneToMany(外键)

xxx = models.ForeignKey('关联的表',on_delete=models.SET_NULL,null=True)

    外键和一对一关系的时候需要加 on_delete 选项,此参数为了避免两个表里的数据不一致问题,不然会报错! 使用 SET_NULL 表示关联表中数据删除不会影响到该表中数据,该字段就为空;加上非空键,让这条字段可以为空

  多对多:ManyToMany(表关联:外键+联合唯一)

    #只需要一个字段和id时不用创建第三张表,会自动创建第三张表

xxx = models.ManyToMany('关联的表')

    # 如果还有其他字段时,就需要创建中间表

xxx = models.ManyToMany('关联的表',through='通过第三张表关联')

  创建模型类

    执行完 makemigrations 和 migrate 的命令后,在数据库我们能看到5张表,其中多对多关系的ManyToManyField 方法自动生成了关系表.

二、关联表的数据操作:

  一对多表关系数据操作:

  正向:一个模型如果定义了一个外键字段,通过这个模型操作外键就叫正向

    增,改:

      第一种:跟之前一样,用传参的方法添加,需要注意的是外键的值必须是关联表中已经存在的值

      第二种:用属性赋值的方式,因为我们再模型类有定义一个 xxx 的属性,而这个属性的对象的类型必须是 xxx 表的类实例对象

外键 关联的表中的数据必须是已存在的(该表中的 外键字段_id 相当于关联表中的 id)

    删:

      外键字段必须加上 null=True 才能删除

      查出该字段,赋值为 None 就可以删除了

    查:

      表实例. 外键字段. 关联表中的字段

    要查某个学院有多少个学生:

      学生表.objects.filter(外键字段__学院名字段=’学院‘)

  反向:从关联表的表反过来查关联它的表的数据

    如果模型I有一个ForeignKey,那么该ForeignKey 所指的模型II实例可以通过一个管理器回前面有ForeignKey的模型I的所有实例。默认情况下,这个管理器的名字为 源模型的小写名_set(foo_set)

    可以再定义是设置 related_name 参数来覆盖 源模型的小写名_set 的名称

  增:

    关联表的实例. 小写源表名_set. create( )

    关联表的实例. 小写源表名_set. add( )

  查:

    关联表的实例. 小写源表名_set. 单表查询的所有方法都可以用

  删:

    删一个:

      关联表的实例. 小写源表名_set. remove(要删除的数据)

    删多个:

      关联表的实例. 小写源表名_set. remove(要删除的数据,要删除的数据)

    删完:

      关联表的实例. 小写源表名_set. clear()

  改:

    关联表的实例. 小写源表名_set. set([添加的数据,添加的数据])

      会先执行 clear() 方法在添加

  多对多表关系数据操作:

    没有指定中间表的时候:

      add,remove,set 都不能用了,必须用中间表操作数据

    有指定中间表的时候:

    不借助中间表,关联的表可以相互访问,查询

  一对一表关系数据操作:

    正向和一对多相似

    反向;直接通过 模型的小写 ;不用 _set 了

三、跨表查询:

  Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:

  例如:

# 查询学院名字为‘计算机学院’的学生的信息 

Student.objects.filter(department__name='计算机学院')

    它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。

#查询学生名字中包含 '小' 的学生的学院信息
Department.objects.filter(student__name__contains='小') # contains 模糊查询
# 查询学号为1的学生所有的课程
Course.objects.filter(student__s_id=1) # 查询报了课程1的所有的学生
Student.objects.filter(course__c_id=1) # 查询报了'python'课程的的学生的所属学院的信息
Department.objects.filter(student__course__name='python') # 查询报了'english'课程的 33 期的学员
Student.objects.filter(course__name='english',grade__num='')

Django 学习第八天——Django模型基础第三节的更多相关文章

  1. django学习-数据库配置-创建模型

    数据库配置 在mysite/settings.py中,包含了django项目设置的python模块 通常,这个配置文件使用SQLite作为默认数据库.如果你不熟悉数据库,或者只是想尝试下django, ...

  2. Django 学习第一天——django 基本介绍和环境搭建

    web 应用设计模式(MTV MVC): MTV: M:models 模型:负责业务数据对象与数据库对象: T:templates 模板:负责如何把数据展示给用户: V:views 视图:负责业务逻辑 ...

  3. Django学习笔记之Django中间件

    准备 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...

  4. Django学习之六:Django 常用模块导入记忆

    Django 常用模块导入记忆 django相关 1. urls相关操作 from django.urls import path, re_path, include from django.urls ...

  5. Django学习笔记之Django Form表单

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  6. Django学习笔记之数据库-模型的操作

    模型的操作 在ORM框架中,所有模型相关的操作,比如添加/删除等.其实都是映射到数据库中一条数据的操作.因此模型操作也就是数据库表中数据的操作. 添加模型 添加模型到数据库中.首先需要创建一个模型.创 ...

  7. Django学习系列13:Django ORM和第一个模型

    ORM—对象关系映射器,是一个数据抽象层,描述存储在数据库中的表,行和列.处理数据库时,可以使用熟悉的面向对象方式,写出更好的代码. 在ORM的概念中,类对应数据库中的表,属性对应列,类的单个实例表示 ...

  8. Django (学习第二部 ORM 模型层)

    Django对数据库的操作 Django的 ORM 简介 ORM操作 (增删改查) ORM操作数据库的增删改查 ORM创建表关系 ORM中常用字段及参数 数据库的查询优化 ORM中如何开启事务 ORM ...

  9. django 数据库配置 ,APP 迁移.模型基础

    # 1.数据库的连接配置django 连接mysql的配置流程:- 安装 pymysql pip install pymysql- 创建数据库用户有创建数据库权限的用户- 创建数据库crm .进入数据 ...

随机推荐

  1. windows与mac下安装nginx

    window下 下载链接,自己选一个版本下载 nginx官网下载 本人放在D盘: 启动nginx 有很多种方法启动nginx (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过 (2)打开 ...

  2. 古代猪文:数论大集合:欧拉定理,exgcd,china,逆元,Lucas定理应用

    /* 古代猪文:Lucas定理+中国剩余定理 999911658=2*3*4679*35617 Lucas定理:(m,n)=(sp,tp)(r,q) %p 中国剩余定理:x=sum{si*Mi*ti} ...

  3. jQuery常见的几个文档处理方式

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. jenkins+git+maven 增量部署思路以及相关脚本

    之前通过jenkins+Git+maven这种方式打war包然后scp到测试环境使用,但是现在项目组要求打增量包,即只部署修改的文件和配置文件. 核心问题:如何获取到变动的文件??? 前置条件:初始化 ...

  5. 调试阶段 获取微信小程序openid

    wx.login({ success: function(res) { //首先获取用户code //res.code wx.request({ url: 'https://api.weixin.qq ...

  6. 20165206 2017-2018-2 《Java程序设计》第五周学习总结

    20165206 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 内部类:支持在一个类中定义另一个类的类. 外嵌类:包含内部类的类,称为内部类的外嵌类. 匿名 ...

  7. k-近邻算法-手写识别系统

    手写数字是32x32的黑白图像.为了能使用KNN分类器,我们需要把32x32的二进制图像转换为1x1024 1. 将图像转化为向量 from numpy import * # 导入科学计算包numpy ...

  8. .NetCore 下开发独立的(RPL)含有界面的组件包 (三)构建界面

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  9. Hadoop数据分析平台项目实战(基于CDH版本集群部署与安装)

    1.Hadoop的主要应用场景: a.数据分析平台. b.推荐系统. c.业务系统的底层存储系统. d.业务监控系统. 2.开发环境:Linux集群(Centos64位)+Window开发模式(win ...

  10. 上传文件---未能找到路径“D:\MyProject\Files\”的一部分

    C# 使用控件FileUpload 上传文件,简单实例: protected void btnUpload_Click(object sender, EventArgs e) { string pat ...