在Django中,related_name
和 related_query_name
都用于自定义反向查询时使用的名称,但它们的作用和使用场景有所不同:
related_name
- 作用:当一个模型通过
ForeignKey
、ManyToManyField
或其他关联字段引用另一个模型时,Django会自动创建一个反向查询器属性。例如,如果模型A有一个指向模型B的外键,那么默认情况下,可以从模型B的对象上通过类似<model_A>_set
的方式来访问所有与之关联的模型A对象。related_name
就是用来重命名这个反向查询器属性。 - 示例:
python
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
在这个例子中,可以通过 author.books.all()
来获取某个作者的所有书籍,而不再是默认的 author.book_set.all()
。
related_query_name
-
作用:主要应用于
ManyToManyField
的情况,并且是在生成查询表达式(query expression)时使用的别名。related_query_name
用来指定在关联查询时,作为查询表达式一部分的字段名称。 -
示例:
pythonclass Tag(models.Model): name = models.CharField(max_length=50) class Article(models.Model): title = models.CharField(max_length=200) tags = models.ManyToManyField(Tag, related_name='articles', related_query_name='tagged_articles')
在这个例子中,虽然可以通过
tag.articles.all()
访问到给定标签关联的所有文章,但当我们使用查询表达式时,比如在过滤Article时,可以这样写:pythonArticle.objects.filter(tagged_articles__name='my_tag')
这里,
tagged_articles
是由related_query_name
指定的查询表达式中的字段名。
总结来说,related_name
更侧重于直接的反向关系查询,而 related_query_name
则更多地关注于查询表达式构建以及在查询语句中更自然地表示这种关联关系。