栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

django学习笔记5-多表查询

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

django学习笔记5-多表查询

紧接着上次笔记:https://blog.csdn.net/qq_52158420/article/details/121662048

2, 反向查询:通过子表查询
  • 练习:查询id=2的name,title,payment
  • 任务:在人员信息表中查询“软件开发”的职业信息

  • 任务:查询人员信息表中查询payme在10000-20000之间的人员信息
3,使用select__related实现关联查询

以主表personinfo为查询对象

  • 练习:查询人员姓名及薪资(姓名来自PerosnInfo表,薪资来自Vocation表)

不妨查看一下框架帮我们生成的关联查询语句


sql语句:SELECT index_personinfo.name, index_vocation.payment FROM index_personinfo LEFT OUTER JO
index_vocation ON (index_personinfo.id = index_vocation.name_id)
到Navicat里去运行上面的查询语句(采用的是左外连接)


**以子表对应的模型Vocation为查询对象
**

  • 查询职业,姓名,年龄(职业来自Vocation对象,姓名,年龄来自PersonInfo对象)对应正向查询


**不妨查看一下框架帮我们生成的关联查询语句
**
sql语句:SELECtindex_vocation.job,index_personinfo.name,index_personinfo.ageFROMindex_vocationINNER JOINindex_personinfoON (index_vocation.name_id=index_personinfo.id)
到Navicat里去运行上面的查询语句(采用的是右外连接)

任务:查询薪资在12000及以上的职业、姓名与年龄
  • 方法一、利用Vocation关联查询PersonInfo (正向关联查询)
    不妨查看一下框架帮我们生成的关联查询语句

sql语句:SELECt index_vocation.job,
index_personinfo.name,
index_personinfo.age,
index_vocation.payment
FROM index_vocation
INNER JOIN index_personinfo ON (index_vocation.
name_id = index_personinfo.id)
WHERe index_vocation.payment >= 12000

到Navicat里去运行上面的查询语句

  • 方法二、利用PersonInfo关联查询Vocation (逆向关联查询)


sql语句:SELECtindex_vocation.job,index_personinfo.name,index_personinfo.age,index_vocation.paymentFROMindex_vocationINNER JOINindex_personinfoON (index_vocation.name_id=index_personinfo.id) WHEReindex_vocation.payment>= 12000

新知识

(一)三表关联查询
  • 准备三个模型:
#省份信息
class Province(models.Model):
    name=models.CharField(max_length=10)

#城市信息
class City(models.Model):
    name=models.CharField(max_length=5)
    province=models.ForeignKey(Province,on_delete=models.CASCADE)


    def __str__(self):
        return str(self.name)


#人员信息
class Person(models.Model):
    name=models.CharField(max_length=10)
    city=models.ForeignKey(City,on_delete=models.CASCADE)

    def __str__(self):
        return str(self.name)

说明: Person通过city外键关联City, City通过province外键关联Province, 删除都采用级联模式on_ delete=models . CASCADE

  • 在控制台执行数据迁移命令:python manage.py makemigrations

- 针对上述数据迁移文件执行命令,生成相应的数据表

  • 添加数据

index__province表:

index__city表:

index__person表:

多表查询

  • 查询记录“朱迪迪”
多表关联查询

准备模型

#表演者
class Performer(models.Model):
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=20)
    nationlity=models.CharField(max_length=20)

    def __str(self):
        return str(self.name)

#节目
class Progarm(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20)
    performer=models.ManyToManyField(Performer)

    def __str__(self):
        return self(self.name)
  • 生成数据迁移文件

  • 插入数据
    index__performer表:index__program表:

3、使用prefetch_ related()实现关联查询

  • 任务:查询“我爱你中国”节目有哪些表演者参加

    新方法

  • 练习:针对职业表,查询"软件开发”的薪资在10000以上的记录

  • 使用fiter()函数实现
  • 任务:针对职业表,按薪资降序查询全部记录

  • 练习:针对职业表,先按工作(job)降序排列,再按薪资(payment)升序排列,查询全部记录

  • 任务:关联职业表与人员信息表进行查询

raw查询实例
  • 任务:查询职业表全部记录
  • 任务:查询职业表软件开发”的记录
  • 方法- -:利用raw_ queny参数搞定

  • 方法二:利用raw_ _query与params参数搞定

  • 任务:查询职业表"软件开发"记录,显示id字段, 别名“编号”,显示job字段, 别名“工作”,显示payment字段,别名薪资”
  • 方法一、 利用as关键字来指定别名
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/674587.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号