先看结论:
正向查询 | 反向查询 | |
---|---|---|
概念 | 由多方查询一方 | 由一方查询多方 |
语法 | 多方的某个对象.外键字段 | 一方对象.模型类名字小写形式_set.all() |
举例 | city.parent | p.area_set.all() |
如果外键字段添加了related_name=abcdefg
语法:一方对象.abcdefg.all()
举例:p.abc.all()
讲解部分:
首先准备Author
和Article
两个模型:
from django.db import models
class Author(models.Model):
"""作者 (一方)"""
name = models.CharField(max_length=100)
class Article(models.Model):
"""文章 (多方)"""
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(Author, on_delete=models.CASCADE,related_name='articles')
# 正向查询:获取某篇文章的作者
article = Article.objects.get(id=1) # 假设我们通过id获取一篇文章
author = article.author # 获取这篇文章的作者
# 反向查询:获取某个作者的所有文章
author = Author.objects.get(name='John Doe') # 假设我们通过名字获取一个作者
articles = author.articles.all() # 获取这个作者的所有文章
这里的Article
模型中的author
字段定义了一个外键关系,指向Author
模型。一个作者可以写多篇文章
正向查询:多方:one_article = Article.objects.get(id=1)
,
一方:author = one_article.author
反向查询:如果我们有一个作者实例 one_author,我们可以通过 one_author.Article_set.all()
来获取这个作者写的所有文章。
一方: one_author = Author.objects.get(name='John Doe')
多方: article = one_author.Article_set.all() ("当没有related_name = '' " 时")