紧接着上次笔记:https://blog.csdn.net/qq_52158420/article/details/121662048
2, 反向查询:通过子表查询- 练习:查询id=2的name,title,payment
- 任务:在人员信息表中查询“软件开发”的职业信息
- 任务:查询人员信息表中查询payme在10000-20000之间的人员信息
以主表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里去运行上面的查询语句(采用的是右外连接)
- 方法一、利用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_ queny参数搞定
- 方法二:利用raw_ _query与params参数搞定
- 任务:查询职业表"软件开发"记录,显示id字段, 别名“编号”,显示job字段, 别名“工作”,显示payment字段,别名薪资”
- 方法一、 利用as关键字来指定别名



