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中模型类的关系,以及模型类关联查询)相关推荐

  1. MongoDB中的聚合管道($lookup多表关联查询、$unwind、$match、$project)

    MongoDB中的聚合管道($lookup多表关联查询.$unwind.$match.$project) 管道的概念 聚合框架 $lookup的功能及语法 主要功能 基本语法 例子 说明 $unwin ...

  2. Django框架(16.Django中的模型类管理器以及自定义管理器)

    模型类.objects.all()->objects是一个什么东西呢? 答:objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询. objects是model ...

  3. Django框架(10.Django中的模型类的定义以及模型类字段属性和选项)

    Django中的模型类的定义以及模型类字段属性和选项 1.模型类的定义 2.模型类属性命名限制 2.1字段类型和属性 2.2选项 1.模型类的定义 ORM:表就代表类,字段代表属性 模型类需要继承自m ...

  4. Django框架(5.django中模型类建立关系和多表关系查询)

    1.建立好模型类: from django.db import models# 设计和模型对应的类,(模型类) # Create your models here.# 一类 # 图书类 class B ...

  5. Django框架(3.django设计模型类、模型类生成表、ORM框架简介)

    ORM框架简介 O是object,也就类对象的意思, R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思, M是mapping,是映射的意思.在ORM框架中,它帮我们把类和数据表进 ...

  6. Django框架(23.Django中的模板的标签、变量、过滤器和注释)

    模板 作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器.模版致力于表达外观 ...

  7. Django框架(19.Django中获取url的参数(位置参数以及关键字参数))

    捕获url参数 进行url匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数. 位置参数 位置参数,参数名可以随意指定   ...

  8. Django框架(8.Django中的模板文件的使用和模板变量的简单使用)

    为什么使用模板 通过视图可以给用户返回一些字符串等等, 那如何向请求者返回一个漂亮的页面呢? 肯定需要用到html.css,如果想要更炫的效果还要加入js,问题来了,这么一堆字段串全都写到视图中,作为 ...

  9. Django框架(6.django后台管理/通过后台对数据表的增删改)

    1.django项目中的admin.py  即:  后台管理相关文件 使用Django提供的相关管理机制的步骤 1.本地化 语言和时区的本地化    ( 修改项目中的settings.py的文件) 2 ...

最新文章

  1. linux redis WARNING overcommit_memory is set to 0! 解决方案
  2. Wireshark初次使用
  3. CentOS6.4卸载自带的OpenJDK并安装jdk1.6.21
  4. 基于间隔推送全量更新数据状态的设计方法
  5. 单片机r6/r7c语言怎么用,关于单片机C51中c语言函数(-nop-())?
  6. Python模块之optparse
  7. 简明 MongoDB 入门教程 1
  8. 大话设计模式---策略模式
  9. 华为鸿蒙被卖了,8%!被卖掉的荣耀过的日子,与华为越来越不同了!
  10. wold文档直接转html文件乱码,打开WORD文档,发现它全是乱码,有时会出现“文件转换”窗口,让您选择编码. 如何处理?...
  11. shibor与沪深300指数的相关性图示
  12. 函数的谓词是什么? cin的返回值是什么?
  13. PC微信机器人之实战分析微信图片加密解密
  14. c语言错误c2059 void,c2059(c语言错误代码c2059)
  15. 以美颜sdk为例,详解sdk接入流程
  16. 制品仓库 Nexus 安装、配置、备份、使用
  17. JS中如何取某个指定字符(前)后的字符串
  18. 【职业女性着装全攻略】_职业女性应该怎样着装
  19. java根据url下载文件出现301 Moved Permanently
  20. 计算机网络【Computer Networks】学习记录01

热门文章

  1. 矩形脉冲信号的频域分析_矩形周期脉冲信号MATLAB实现
  2. 【身份认证及权限控制一】单点登录
  3. JPA中实现查询list
  4. mybatis实现自定义SQL并且请求参数是集合
  5. 考研【复试技巧】如果复试时太紧张,遇到不会的问题只能凉了吗?这些技巧收下!
  6. Java22-day13【Lambda表达式(标准格式、练习、注意事项)、接口组成更新(默认-静态-私有方法)、方法引用(构造器)】
  7. 10-NSPersistentContainer介绍
  8. java实现多路分发
  9. Java 面试题问与答:编译时与运行时
  10. 程序员40岁之后怎么办