django related_query_name和related_name的区别

在Django中,related_namerelated_query_name 都用于自定义反向查询时使用的名称,但它们的作用和使用场景有所不同:

related_name

  • 作用:当一个模型通过 ForeignKeyManyToManyField 或其他关联字段引用另一个模型时,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 用来指定在关联查询时,作为查询表达式一部分的字段名称。

  • 示例:

    python 复制代码
    class 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时,可以这样写:

    python 复制代码
    Article.objects.filter(tagged_articles__name='my_tag')

    这里,tagged_articles 是由 related_query_name 指定的查询表达式中的字段名。

总结来说,related_name 更侧重于直接的反向关系查询,而 related_query_name 则更多地关注于查询表达式构建以及在查询语句中更自然地表示这种关联关系。

相关推荐
这个男人是小帅12 分钟前
【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
Shy9604184 小时前
Doc2Vec句子向量
python·语言模型
秀儿还能再秀7 小时前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习
阿_旭8 小时前
如何使用OpenCV和Python进行相机校准
python·opencv·相机校准·畸变校准
幸运的星竹8 小时前
使用pytest+openpyxl做接口自动化遇到的问题
python·自动化·pytest
Tttian6229 小时前
Vue全栈开发旅游网项目(11)-用户管理前端接口联调
前端·vue.js·django
kali-Myon9 小时前
ctfshow-web入门-SSTI(web361-web368)上
前端·python·学习·安全·web安全·web
B站计算机毕业设计超人9 小时前
计算机毕业设计Python+大模型农产品价格预测 ARIMA自回归模型 农产品可视化 农产品爬虫 机器学习 深度学习 大数据毕业设计 Django Flask
大数据·爬虫·python·深度学习·机器学习·课程设计·数据可视化