一对多 or 一对一

前提条件:

name = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="ps")

正向查询:

data= Student.objects.get(id=1)

data.product.title#查询关联表的数据的title

反向查询

1.没设置有related_name

data = Product.objects.get(id=1)

v=data.student_set.first()#Student模型小写_set

v.name

2.设置有related_name

data = Product.objects.get(id=1)

data.ps.first().name

此类正想查询和反向查询还可以用作条件查询

正向
In [38]: data = Vocation.objects.filter(id=1,name__name="Joe").first()#Vocation 外键.外键对象属性

In [40]: data.name
Out[40]: <Infos: Joe>

In [41]: data.name.name
Out[41]: 'Joe'

反向

p=Infos.objects.filter(ps__job="网站设计").first()

p.joe

此类有个缺点,就是要执行两次sql,第一次是查询某张数据表数据,第二次通过外键关联获取另一张数据表的信息,为了较少执行次数,提高效率,可以用select_related 和prefetch_related方法实现,该方法执行一次就能实现多表查询。

select_related主要针对一对多一对一查询:

#以从表infos为查询对象

Infos.objects.select_related("ps").values("name","ps__payment") ===`infos`.`name`, `index_vocation`.`payment` FROM `infos` LEFT OUTER JOIN `vocation` ON (`infos`.`id` = `vocation`.`name_id`)

#以主编Vocation为查询对象

#select_related使用INNER JOIN方式查询两个数据表,参数为name代表外键字段为name

In [60]: data = Vocation.objects.select_related("name").values("name","name__age")

In [61]: data
Out[61]: <QuerySet [{'name': 1, 'name__age': 20}, {'name': 2, 'name__age': 18}, {'name': 3, 'name__age': 22}, {'name': 4, 'name__age': 24}, {'name': 5, 'name__age': 25}]>
In [62]: print(data.query)
SELECT `vocation`.`name_id`, `info`.`age` FROM `vocation` INNER JOIN `infos` ON (`vocation`.`name_id` = `infos`.`id`)

#获取两个模型,以模型Vocation的payment 大于8000位查询条件

v=Vocation.objects.select_related("name")
In [65]: v=Vocation.objects.select_related("name").filter(payment__gt=8000)

In [66]: print(v.query)
SELECT `index_vocation`.`id`, `index_vocation`.`job`, `index_vocation`.`title`, `index_vocation`.`payment`, `index_vocation`.`name_id`, `index_personinfo`.`id`, `index_personinfo`.`name`, `index_personinfo`.`age`, `index_personinfo`.`hirDate` FROM `index_vocation` INNER JOIN `index_personinfo` ON (`index_vocation`.`name_id` = `index_personinfo`.`id`) WHERE `index_vocation`.`payment` > 8000

v[0].name.age   19

#select_related三个及以上数据表查询,多用于一对一,一对多和join操作

1.查询joe所居住的省

data=Person.object.select_related("living__province").get(name="joe")

data.living.province

#prefetch_related,用于多对多,分别查询每张数据表,然后由python语法处理它们的关系。

class Performer(models.Model):id = models.IntegerField(primary_key=True)name = models.CharField(max_length=100)nationality = models.CharField(max_length=20)def __str__(self):return str(self.name)class Program(models.Model):id = models.IntegerField(primary_key=True)name = models.CharField(max_length=100)performer=models.ManyToManyField(Performer)def __str__(self):return str(self.name)

执行数据库迁移命令,可以生成多对多映射表,

In [2]: p=Program.objects.prefetch_related("performer").filter(name="李斯特").first(
   ...: )

In [3]: p
Out[3]: <Program: 李斯特>

#根据外键字段performer获取当前一对多或者多对多的关系

In [4]: p.performer.all()
Out[4]: <QuerySet [<Performer: hant>, <Performer: keli>, <Performer: soli>, <Performer: meizi>]>

In [5]: p.performer.first()
Out[5]: <Performer: hant>

django orm querset 多表查询相关推荐

  1. Django 笔记6 -- 多表查询

    Django 笔记6 – 多表查询 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Djang ...

  2. 使用django创建一个单表查询的图书管理系统

    使用django创建一个单表查询的图书管理系统 在settings.py文件中添加(用于连接mysql数据库) DATABASES = {'default': {'ENGINE': 'django.d ...

  3. django orm关联查询_django中orm的多表查询

    一.创建模型 下面我们通过图书管理系统,来设计出每张表之间的对应关系. 通过上图关系,来定义一下我们的模型类. from django.db import models class Book(mode ...

  4. django模型的连表查询

    在数据库当中,可以通过设置外键的方式将两个表进行连接,如果需要查询数据的时候就需要进行连表查询. 例如:假如我现在有两张表.userinfo 和 usertype,userinfo里面记录了用户的信息 ...

  5. sql跨表查询_白话django之ORM的查询语句

    教程源码:z991/django_turital 在日常开发中,数据库的增删改查(CDUR)中,查询需求偏多,所以查询的语法比增删改操作多得多,尤其是跨表关联查询,可以让代码精简很多年. 直接上代码吧 ...

  6. Django之ORM和单表操作

    ORM简介 ORM是"对象-关系-映射"的简称.(Object Relational Mapping,简称ORM) 类对象--->sql--->pymysql---&g ...

  7. django 单表查询

    一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

  8. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询 单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models.T ...

  9. django orm级联_Django数据表关联关系映射(一对一、一对多、多对多)

    我们知道涉及到数据表之间的对应关系就会想到一对一.一对多.多对多,在学习 MySQL 数据库时表关系设计是需要重点掌握的知识.Django 中定义了三种关系类型的字段用来描述数据库表的关联关系:一对多 ...

最新文章

  1. 分布式概念-分布式事务,并发处理协议
  2. tensorflow gan 网络 示例
  3. NVL 和NVL2函数
  4. 为什么我们要放弃win10 去使用deepinv20和ous呢
  5. Design Pattern - Decorator(C#)
  6. python流程控制语句-Python_流程控制语句
  7. 最长递增子序列_python_算法与数据结构
  8. 未来计算机将具有图像识别 定理证明,[单选] 低温计与高温计所测温度的分界线为()。...
  9. 补发《超级迷宫》站立会议九
  10. tensorrt安装_利用TensorRT对深度学习进行加速
  11. PHP童鞋改JAVA代码怎么处理
  12. 七句话道出做人的底线【精辟】
  13. kali安装DVWA详细教程
  14. xmind8 Pro序列号
  15. 计算机算平方根原理,算术平方根与计算器
  16. 华为云文字识别关键技术和特别需要注意的事宜
  17. android 9.0 开机动画,Android bootanim开机动画启动流程
  18. 【moeCTF题解-0x01】Reverse
  19. 【供应链】全面分析供应链类型
  20. Textpad的安装和配置

热门文章

  1. 在VMware上安装win10
  2. selenium操作各种浏览器
  3. ####好好好#####知识图谱上的双塔召回:阿里的IntentGC模型
  4. oracle创建本地表空间,本地管理表空间——大家继续讨论!
  5. Windows认证机制详解(借物表在文章末尾)
  6. 解决SQL Server报错:229、262、5123
  7. 网络协议对应的端口号
  8. WebView 加载页面空白及加载不全问题
  9. js中eq neq gt gte lt lte分别是什么意思
  10. VMware vSphere 虚拟化实施手册及故障案例 | 多图