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 -- 多表查询相关推荐

  1. MySQL 笔记5 -- 多表查询

    MySQL 笔记5 – 多表查询 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 一.表之间关系 1.一对一 ...

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

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

  3. django模型的连表查询

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

  4. mysql学习笔记14 多表查询初步

    对数据分组的总结 举例:统计各个部门的平均工资,并且是大于1000的,并且按照平均工资从高到底排序 mysql> select avg(stsal) as myavgsal, stdepno f ...

  5. php多表查询 例子,thinkphp学习笔记之多表查询

    在操作过程中,两表查询都没有问题,但是三表查询就开始出现问题 有以下三张表,分表为pl表(uid,content),user表(id,username),lyb表(uid,title) 多表查询操作有 ...

  6. django orm querset 多表查询

    一对多 or 一对一 前提条件: name = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="ps&q ...

  7. 数据库学习笔记6--MySQL多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  8. mysql with 查询_mysql笔记(6)-多表查询之with

    本文将简单介绍with子句的格式和用法 1.目的 通过创建一张(或多张)临时表,实现数据的抽离,从而方便进行数据的比较 2.格式 //创建2张临时表,并在这2张临时表的基础上进行查询 with tem ...

  9. 《卸甲笔记》-多表查询之二

    13增加右外连接,显示部门40的信息 Oracle SQL> select *2 from emp e,dept d3 where e.deptno(+)=d.deptno;EMPNO ENAM ...

最新文章

  1. 深度学习Dropout技术分析
  2. 蕨叶形生物刷新生命史,动物界至少起源于5.7亿年前
  3. 利用OpenCV的函数cvtcolor()进行颜色空间转换时需要注意的地方
  4. Cracking The Coding Interview5.2
  5. redis的数据类型及设置方法
  6. 又到中元节 应用宝教你如何打败各种鬼
  7. MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程
  8. C语言编程基础 打印图形
  9. 复化辛普森公式求二重积分matlab源码及例题
  10. github每次push时自动输入用户名密码
  11. 超详细JDK下载与安装步骤
  12. 关于安装mysql时出现安装错误之后的万能解决方案(目前解决了本人安装时的各种问题和同学的问题)
  13. bios sgx需要开启吗_Win10改Win7,UEFI改Legacy 启动,修改BIOS大全
  14. slf4j、log4j日志级别与配置
  15. 【渝粤教育】广东开放大学 经济法基础 形成性考核 (38)
  16. 活动网络——用顶点表示活动的网络AOV和拓扑
  17. 电脑计算机键盘没反应了怎么办,电脑键盘无法使用怎么办 键盘没反应解决办法...
  18. sparc处理器开发工具_SPARC处理器启动代码的分析与编程
  19. 江苏省各地级市县经纬度查询大全
  20. 10种基于MATLAB的方程组求解方法

热门文章

  1. 7月清北学堂培训 Day 5
  2. LUOGU P4587 [FJOI2016]神秘数(主席树)
  3. scrapy的post登录:renren
  4. Python if条件判断
  5. 同一公司代码下工厂间的库存转储 (轉載)
  6. 替换Webbrowser默认的弹出菜单
  7. 正则表达式 运算 常见
  8. 汽车行业如何个性化定制转型?看APS系统在这家企业的运用
  9. Node.js HTTPS
  10. CMMI for Development读书笔记-目录