Django中related_name的用法说明
本文详解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用法的说明到此结束,希望能为读者提供参考。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









