📜  related_name – Django 内置字段验证(1)

📅  最后修改于: 2023-12-03 15:34:42.419000             🧑  作者: Mango

Related_name - Django 内置字段验证

在 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 字段定义自定义反向关系名称,避免反向关系的名称冲突,使得查询更加简单方便。