Django框架(14.Django中模型类的关系,以及模型类关联查询)
Django中模型类的关系,以及模型类关联查询
1.模型类关系
1.1 一对多关系
1.2多对多关系
1.3 一对一关系
1.4 一对多举例:
1.5 多对多举例:
1.6 一对一举例:
2.关联查询(一对多)
2.1查询和对象关联的数据
2.2通过模型类实现关联查询
1.模型类关系
1.1 一对多关系
例:图书类-人物类
models.ForeignKey() 定义在多的类中。
Django中字段属性 on_delete参数含义:
设置外键时,需要通过on_delete选项指明主要删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:
- CASCADE级联,删除主表数据时连同一起删除外键表中数据
- PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
- SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
- SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
- SET()设置为特定值或者调用特定方法
- DO_NOTHING不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常
举个例子: 西游记这本书如果删除了,就对其中的人物,比如说孙悟空和白骨精这两个人物有影响
就会有三种情况:①图书表要删除一本书,人物表就不让删除,因为他俩之间有关系
②图书表的图书删了之后,人物还在,只不过图书就变空了
③图书表中图书删了之后,这个图书的人物跟着就删除了on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为 on_delete=models.CASCADE, # 删除关联数据,与之关联也删除 on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做 on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError # models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True) on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理) # models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值') on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理) on_delete=models.SET, # 删除关联数据, a. 与之关联的值设置为指定值,设置:models.SET(值) b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
1.2多对多关系
例:新闻类-新闻类型类 体育新闻 国际新闻
models.ManyToManyField() 定义在哪个类中都可以。
1.3 一对一关系
例:员工基本信息类-员工详细信息类. 员工工号
models.OneToOneField定义在哪个类中都可以。
1.4 一对多举例:
class BookInfo(models.Model):"""图书模型类"""# 图书名称btitle = models.CharField(max_length=20)# 出版日期bpub_date = models.DateField()# 阅读量bread = models.IntegerField(default=0)# 评论量bcomment = models.IntegerField(default=0)# 删除标记isDelete = models.BooleanField(default=False)class HeroInfo(models.Model):"""英雄人物模型类"""# 英雄名hname = models.CharField(max_length=20)# 性别hgender = models.BooleanField(default=False)# 备注hcomment = models.CharField(max_length=200)# 关系属性hbook = models.ForeignKey('BookInfo', on_delete='CASCADE')# 删除标记isDelete = models.BooleanField(default=False)
1.5 多对多举例:
# 新闻类型类 class NewsType(models.Model):# 类型名type_name = models.CharField(max_length=20)# 关系属性,代表类型下面的信息type_news = models.ManyToManyField("NewsInfo")# 新闻类 class NewsInfo(models.Model):# 新闻标题title = models.CharField(max_length=128)# 发布时间pub_date = models.DateTimeField(auto_now_add=True)# 信息内容content = models.TextField()# 关系属性# news_type = models.ManyToManyField('NewsType')
1.6 一对一举例:
# 员工基本信息类 class EmployeeBasicInfo(models.Model):# 姓名name = models.CharField(max_length=20)# 性别gender = models.BooleanField(default=False)# 年龄age = models.IntegerField()# 关联属性employee_detail = models.OneToOneField('EmployeeDetailInfo',on_delete=models.CASCADE)# 员工基本信息类 class EmployeeDetailInfo(models.Model):# 联系地址addr = models.CharField(max_length=256)# 关系属性,代表员工基本信息# employee_basic = models.OneToOneField("EmployeeBasicInfo",on_delete=models.CASCADE)
2.关联查询(一对多)
2.1查询和对象关联的数据
在一对多关系中,一对应的类我们把它叫做一类,多对应的那个类我们把它叫做多类,我们把多类中定义的建立关联的类属性叫做关联属性。
注意:
1. 通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查。
2. 写关联查询条件的时候,如果类中没有关联属性,条件需要对应类的名,如果类中有关系属性,直接写关系属性
图书模型类:BookInfo 英雄模型类:HeroInfo
例1:查询id为1的图书关联的英雄的信息。
b=BookInfo.objects.get(id=1) # 先查到这个数据
b.heroinfo_set.all() # 然后 .模型类名(小写)_set.all()
通过模型类查询:
HeroInfo.objects.filter(hbook__id=1) # 最终查什么信息,在那个表中,就用哪个模型类.objects......
# 有关联属性就直接, 属性名称_ _ 属性名 = ?
例2:查询id为1的英雄关联的图书信息。
h = HeroInfo.objects.get(id=1)
h.hbook
通过模型类查询:
BookInfo.objects.filter(heroinfo__id=1)
格式:
由一类的对象查询多类的时候:
一类的对象.多类名小写_set.all() #查询所用数据
由多类的对象查询一类的时候:
多类的对象.关联属性 #查询多类的对象对应的一类的对象
由多类的对象查询一类对象的id时候:
多类的对象. 关联属性_id
2.2通过模型类实现关联查询
注意:
1. 通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查。
2. 写关联查询条件的时候,如果类中没有关联属性,条件需要对应类的名,如果类中有关系属性,直接写关系属性
例:查询图书信息,要求图书关联的英雄的描述包含'八'。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
例:查询图书信息,要求图书中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt=3)
例:查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle='天龙八部')
通过多类的条件查询一类的数据:
一类名.objects.filter(多类名小写__多类属性名__条件名)
通过一类的条件查询多类的数据:
多类名.objects.filter(关联属性__一类属性名__条件名)
Django框架(14.Django中模型类的关系,以及模型类关联查询)相关推荐
- MongoDB中的聚合管道($lookup多表关联查询、$unwind、$match、$project)
MongoDB中的聚合管道($lookup多表关联查询.$unwind.$match.$project) 管道的概念 聚合框架 $lookup的功能及语法 主要功能 基本语法 例子 说明 $unwin ...
- Django框架(16.Django中的模型类管理器以及自定义管理器)
模型类.objects.all()->objects是一个什么东西呢? 答:objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询. objects是model ...
- Django框架(10.Django中的模型类的定义以及模型类字段属性和选项)
Django中的模型类的定义以及模型类字段属性和选项 1.模型类的定义 2.模型类属性命名限制 2.1字段类型和属性 2.2选项 1.模型类的定义 ORM:表就代表类,字段代表属性 模型类需要继承自m ...
- Django框架(5.django中模型类建立关系和多表关系查询)
1.建立好模型类: from django.db import models# 设计和模型对应的类,(模型类) # Create your models here.# 一类 # 图书类 class B ...
- Django框架(3.django设计模型类、模型类生成表、ORM框架简介)
ORM框架简介 O是object,也就类对象的意思, R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思, M是mapping,是映射的意思.在ORM框架中,它帮我们把类和数据表进 ...
- Django框架(23.Django中的模板的标签、变量、过滤器和注释)
模板 作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器.模版致力于表达外观 ...
- Django框架(19.Django中获取url的参数(位置参数以及关键字参数))
捕获url参数 进行url匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数. 位置参数 位置参数,参数名可以随意指定 ...
- Django框架(8.Django中的模板文件的使用和模板变量的简单使用)
为什么使用模板 通过视图可以给用户返回一些字符串等等, 那如何向请求者返回一个漂亮的页面呢? 肯定需要用到html.css,如果想要更炫的效果还要加入js,问题来了,这么一堆字段串全都写到视图中,作为 ...
- Django框架(6.django后台管理/通过后台对数据表的增删改)
1.django项目中的admin.py 即: 后台管理相关文件 使用Django提供的相关管理机制的步骤 1.本地化 语言和时区的本地化 ( 修改项目中的settings.py的文件) 2 ...
最新文章
- linux redis WARNING overcommit_memory is set to 0! 解决方案
- Wireshark初次使用
- CentOS6.4卸载自带的OpenJDK并安装jdk1.6.21
- 基于间隔推送全量更新数据状态的设计方法
- 单片机r6/r7c语言怎么用,关于单片机C51中c语言函数(-nop-())?
- Python模块之optparse
- 简明 MongoDB 入门教程 1
- 大话设计模式---策略模式
- 华为鸿蒙被卖了,8%!被卖掉的荣耀过的日子,与华为越来越不同了!
- wold文档直接转html文件乱码,打开WORD文档,发现它全是乱码,有时会出现“文件转换”窗口,让您选择编码. 如何处理?...
- shibor与沪深300指数的相关性图示
- 函数的谓词是什么? cin的返回值是什么?
- PC微信机器人之实战分析微信图片加密解密
- c语言错误c2059 void,c2059(c语言错误代码c2059)
- 以美颜sdk为例,详解sdk接入流程
- 制品仓库 Nexus 安装、配置、备份、使用
- JS中如何取某个指定字符(前)后的字符串
- 【职业女性着装全攻略】_职业女性应该怎样着装
- java根据url下载文件出现301 Moved Permanently
- 计算机网络【Computer Networks】学习记录01