Django 笔记6 -- 多表查询
Django 笔记6 – 多表查询
Django 系列笔记是笔者学习、实践使用 Django 的相关笔记,大量参考了知了课堂的《Django零基础到项目实战》教程。
参考文档:
Django官方文档(英文)
Django 中文文档
一、一对一
1、概要
- 在实际网站中,可能需要保存用户的许多信息,但是有些信息是不经常用的。如果把所有信息都存放到一张表中可能会影响查询效率,因此可以把用户的一些不常用的信息存放到另外一张表中。用户信息的概要表和详细表就是典型的一对一的关系。
- Django 通过 Field 为 OneToOneField 的字段实现一对一的关系。
2、ORM 模型
class User(models.Model):"""用户信息概要表"""username = models.CharField(max_length=20)password = models.CharField(max_length=100)class UserExtension(models.Model): """用户信息详细表"""birthday = models.DateTimeField(null=True) school = models.CharField(blank=True,max_length=50) # 设置与 User 表一对一,反向引用名为 extensionuser = models.OneToOneField("User", on_delete=models.CASCADE, related_name='extension')
3、查询
正向引用: UserExtension 表中的对象查询 User 表中对应对象的信息
# 查询详细表对象对应的概要信息的指定字段值,格式如下
UserExtension对象.一对一字段名.对应表的列名# 示例
user_extension = UserExtension.objects.get(id='xx')
user_extension.user.username
反向引用: User 表中的对象查询 UserExtension 表中对应对象的信息
# 查询用户对象对应的详细信息的指定字段值,格式如下
User对象.反向引用名.对应表的列名# 示例
user = User.objects.get(name='xx')
user.extension.school
二、一对多
1、概要
- 一个文章只能由一个作者编写,但是一个作者可以写多篇文章。作者和文章之间的关系就是典型的一对多的关系。
- Django 通过 Field 为 ForeignKey 的字段实现一对多的关系。
2、ORM 模型
class User(models.Model):"""用户信息概要表"""username = models.CharField(max_length=20)password = models.CharField(max_length=100)class Article(models.Model):"""文章信息表"""title = models.CharField(max_length=100)content = models.TextField()# 设置与 User 表一对多,反向引用名为 articlesauthor = models.ForeignKey("User", on_delete=models.CASCADE, related_name='articles')
3、查询
正向引用: Article 表中的对象查询 User 表中对应对象的信息
# 查询文章对象对应的作者概要信息的指定字段值,格式如下
Article对象.一对多字段名.对应表的列名# 示例
article = Article.objects.get(id='xx')
article.user.username
反向引用: User 表中的对象查询 Article 表中对应对象的信息
# 查询用户对象对应的所有文章,格式如下
User对象.反向引用名.all()# 查询用户对象对应的一篇文章,格式如下
User对象.反向引用名.first()# 示例
user = User.objects.get(name='xx')
user.articles.all()
# 可以通过遍历 .all() 生成的对象进一步查询到具体的字段名
三、多对多
1、概要
- 一篇文章可以有多个标签,一个标签可以被多个文章所引用。因此标签和文章的关系是典型的多对多的关系。
- Django 通过 Field 为 ManyToManyFiel 的字段实现多对多的关系。
- 在数据库层面 Django 会自动生成一张中间表来关联多对多的两张表。
2、ORM 模型
class Article(models.Model):"""文章信息表"""title = models.CharField(max_length=100)content = models.TextField()# 设置与 Tag 表多对多,反向引用名为 articlestags = models.ManyToManyField("Tag",related_name="articles")class Tag(models.Model):"""标签表"""name = models.CharField(max_length=50)
3、查询
正向引用: Article 表中的对象查询 Tag 表中对应对象的信息
# 查询文章对应的所有标签,格式如下
Article对象.多对多字段名.all()# 示例
article = Article.objects.get(id='xx')
article.tags.all()
反向引用: Tag 表中的对象查询 Article 表中对应对象的信息
# 查询标签对应的所有文章,格式如下
Tag对象.反向引用名.all()# 示例
tag = Tag.objects.get(name='xx')
tag.articles.all()
四、related_name 和 related_query_name:
1、related_name:反向引用名
- 默认为:模型名字小写_set
- 可以通过指定 related_name 来自定义反向引用名
- 如果不使用反向引用,那么可以指定related_name=’+’
2、related_query_name:反向查询名
- 默认为:未自定义 related_name 时为模型名小写,自定义 related_name 时与 related_name 一致
- 可以通过指定 related_query_name 来自定义反向引用名
# 使用方法,格式:
User.objects.filter(反向查询名__字段名=value)# 示例,设:models.ForeignKey("User", on_delete=models.CASCADE, related_query_name='article')
users = User.objects.filter(article__title='abc')
GOOD LUCK!
Django 笔记6 -- 多表查询相关推荐
- MySQL 笔记5 -- 多表查询
MySQL 笔记5 – 多表查询 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 一.表之间关系 1.一对一 ...
- 使用django创建一个单表查询的图书管理系统
使用django创建一个单表查询的图书管理系统 在settings.py文件中添加(用于连接mysql数据库) DATABASES = {'default': {'ENGINE': 'django.d ...
- django模型的连表查询
在数据库当中,可以通过设置外键的方式将两个表进行连接,如果需要查询数据的时候就需要进行连表查询. 例如:假如我现在有两张表.userinfo 和 usertype,userinfo里面记录了用户的信息 ...
- mysql学习笔记14 多表查询初步
对数据分组的总结 举例:统计各个部门的平均工资,并且是大于1000的,并且按照平均工资从高到底排序 mysql> select avg(stsal) as myavgsal, stdepno f ...
- php多表查询 例子,thinkphp学习笔记之多表查询
在操作过程中,两表查询都没有问题,但是三表查询就开始出现问题 有以下三张表,分表为pl表(uid,content),user表(id,username),lyb表(uid,title) 多表查询操作有 ...
- django orm querset 多表查询
一对多 or 一对一 前提条件: name = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="ps&q ...
- 数据库学习笔记6--MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- mysql with 查询_mysql笔记(6)-多表查询之with
本文将简单介绍with子句的格式和用法 1.目的 通过创建一张(或多张)临时表,实现数据的抽离,从而方便进行数据的比较 2.格式 //创建2张临时表,并在这2张临时表的基础上进行查询 with tem ...
- 《卸甲笔记》-多表查询之二
13增加右外连接,显示部门40的信息 Oracle SQL> select *2 from emp e,dept d3 where e.deptno(+)=d.deptno;EMPNO ENAM ...
最新文章
- 深度学习Dropout技术分析
- 蕨叶形生物刷新生命史,动物界至少起源于5.7亿年前
- 利用OpenCV的函数cvtcolor()进行颜色空间转换时需要注意的地方
- Cracking The Coding Interview5.2
- redis的数据类型及设置方法
- 又到中元节 应用宝教你如何打败各种鬼
- MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程
- C语言编程基础 打印图形
- 复化辛普森公式求二重积分matlab源码及例题
- github每次push时自动输入用户名密码
- 超详细JDK下载与安装步骤
- 关于安装mysql时出现安装错误之后的万能解决方案(目前解决了本人安装时的各种问题和同学的问题)
- bios sgx需要开启吗_Win10改Win7,UEFI改Legacy 启动,修改BIOS大全
- slf4j、log4j日志级别与配置
- 【渝粤教育】广东开放大学 经济法基础 形成性考核 (38)
- 活动网络——用顶点表示活动的网络AOV和拓扑
- 电脑计算机键盘没反应了怎么办,电脑键盘无法使用怎么办 键盘没反应解决办法...
- sparc处理器开发工具_SPARC处理器启动代码的分析与编程
- 江苏省各地级市县经纬度查询大全
- 10种基于MATLAB的方程组求解方法