Django中related_name的用法说明

林见深
林见深
发布时间:2026-10-13| 2人浏览过
原创

本文详解Django中related_name参数的作用,通过具体案例对比默认的fruit_set反向查询与自定义related_name的便捷性,展示如何优化模型关联查询。

Django外键反向查询基础

我们从基础概念开始讨论:

假设一位顾客在水果摊购买了两种水果:人参果和蟠桃。摊主后来察觉遗失了珍贵物品,可能与一位100岁的老人有关。通过核对收款记录,摊主锁定该顾客,发现其购买了万年蟠桃和亿年人参,随即情绪激动。

这位顾客为何会有这样的经历?

模型定义与关系构建

基于上述场景,我们定义两个数据模型:买方模型和水果模型。这是一个典型的一对多关系,即一个买方对应多个水果记录。


class Buyer(models.Model):
  name = models.CharField(verbose_name='买主名', max_length=10) 
  Alipay_id = models.CharField(verbose_name='支付宝账号') 
  age = models.IntegerField(verbose_name='买主年龄',blank = True)
 
class Fruit(models.Model): 
  buyer = models.ForeignKey(Buyer, related_name='buyer_fruit') 
  fruit_name = models.CharField(verbose_name='水果名', max_length=10) 
  weight = models.FloatField(verbose_name='水果重量') 

默认反向查询机制

通常,若要查询某位买方购买的水果,需先根据条件获取买方信息,再通过该信息查询其购买的水果。例如:


#首先获得水果模型中外键指向的表中对象:
buyer = Buyer.objects.filter(age = 100).first()
 
#然后通过‘_set'方法获得子表中的数据:
fruits = buyer.fruit_set.all() 
"""
django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。 这个属性的名称默认是以子表的名称小写加上_set()来表示,这里我们的主表是buyer,字表是fruit,所以主表外键的属性就是fruit_set
"""

上述代码中的fruit_set是Django默认生成的反向查询属性。建议采用自定义方式定义外键,使代码更具可读性和可控性。

使用related_name优化查询

related_name参数正是用于此目的。在子表定义外键时,通过设置related_name字段,可以指定子表在主表中对应的反向查询属性名。

具体配置如下:


class Fruit(models.Model): 
  buyer = models.ForeignKey(Buyer, related_name='buyer_fruit') 
"""
主表:buyer
子表:fruit
子表在主表中对应的外键属性:related_name='buyer_fruit'
"""

通过自定义外键,我们可以更直观地获取所需信息:


#首先获得水果模型中外键指向的表中对象:
buyer = Buyer.objects.filter(age = 100).first()
 
#然后通过子表中自定义的外键获取子表的所有信息:
fruits = buyer.buyer_fruit.all() 

以上关于Django中related_name用法的说明到此结束,希望能为读者提供参考。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。