Django联表查询详解:从主表到从表,从从表到主表
Django中 ,联表查询是指从多个相关模型中获取数据。这些模型之间通过ForeignKey、ManyToManyField等字段建立关系,掌握好查询语法对提高开发效率非常重要。
1. 模型定义
首先看一个典型的一对多关系模型定义:
通过related_name指定反向关系名,不指定则默认为book_set
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
class Book(models.Model):
title = models.CharField(max_length=200)
price = models.DecimalField(max_digits=5, decimal_places=2)
author = models.ForeignKey(
Author,
on_delete=models.CASCADE,
related_name='my_books'
)
2. 从表查主表(正向关系)
2.1 通过外键字段直接查询
只查关联字段:
# 方式1:使用 _id 后缀,直接查询外键值
book = Book.objects.filter(author_id=1)
# 方式2:使用外键字段名
book = Book.objects.filter(author=1)
2.2 跨表查询主表字段
跨表查关联表的字段,用双下划线__
# 使用双下划线(__)跨表查询
books = Book.objects.filter(author__name='张三')
books = Book.objects.filter(author__age__gt=30)
# 使用select_related()优化查询
books = Book.objects.select_related('author').filter(author__name='张三')
- select_related() 用于优化一对一或多对一关系的查询
- 适合在后续代码中需要访问关联表数据的场景
- 会立即执行 JOIN 查询
3. 主表查从表(反向关系)
3.1 使用默认反向关系名
反向关系,未指定related_name时,默认使用 模型名小写_set
,很好理解,就是和主表关联的从表数据的set集合
author = Author.objects.get(id=1)
books = author.book_set.all() # 获取作者的所有图书