📅  最后修改于: 2023-12-03 15:34:42.419000             🧑  作者: Mango
在 Django 中,related_name是一个字段选项,它允许你为从 parent model 到 child model 的关系创建自定义反向关系名称。使用 related_name 选项可以避免反向关系的名称冲突。
related_name 是在 ForeignKey 或者 ManyToManyField 中使用的。例如,如果你有如下的模型:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, related_name='books', on_delete=models.CASCADE)
在这个模型中,我们定义了一个 Book 模型,它通过外键关联到了 Author 模型,我们通过 related_name='books' 选项,来定义了 Author 具有一个反向关系:它有多个 books 属性,它允许我们通过相反的方向来查询相关的 book 对象:
author = Author.objects.create(name='Tom')
book1 = Book.objects.create(title='Python', author=author)
book2 = Book.objects.create(title='Django', author=author)
# 通过反向关系查询 book 对象
books = author.books.all()
如果你有一个多对多关系,使用关键字参数 related_name 就更为重要。例如:
class Person(models.Model):
name = models.CharField(max_length=100)
friends = models.ManyToManyField('self')
在这种情况下,Django 会自动创建一个中间表来实现多对多关系。如果你想查询一个人的朋友,由于 Django 不知道应该从哪个字段来创建反向关系,因此将抛出一个异常:
"Person" has a ManyToMany relation with model Person, which has either not been installed or is abstract.
为了解决这个问题,我们需要更新模型:
class Person(models.Model):
name = models.CharField(max_length=100)
friends = models.ManyToManyField('self', related_name='related_friends')
我们可以调用 related_friends 属性来查询一个人的朋友。
使用 related_name 选项可以方便的为 ForeignKey 或者 ManyToManyField 字段定义自定义反向关系名称,避免反向关系的名称冲突,使得查询更加简单方便。