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 则更多地关注于查询表达式构建以及在查询语句中更自然地表示这种关联关系。

相关推荐
Owen__z2 分钟前
GEE统计特定区域特定时间上的Landsat/Sentinel的影像信息
python·sentinel·gee·geemap·landsat
川石课堂软件测试11 分钟前
Python | 高阶函数基本应用及Decorator装饰器
android·开发语言·数据库·python·功能测试·mysql·单元测试
Naiva39 分钟前
【小技巧】PyCharm建立项目,VScode+CodeX+WindowsPowerShell开发Python pyQT6
vscode·python·pycharm
nvd111 小时前
asyncio.run() vs asyncio.gather():启动器与聚合器, 为何Jupyter notebook里能直接使用await?
开发语言·python·jupyter
EEG小佬1 小时前
Jupyter选择内核时如何找到虚拟环境
ide·python·jupyter
文人sec1 小时前
使用python-pandas-openpyxl编写运营查询小工具
开发语言·python·pandas
hu_yuchen1 小时前
问卷系统自动化测试报告
软件测试·python
百锦再2 小时前
第8章 模块系统
android·java·开发语言·python·ai·rust·go
Ashlee_code2 小时前
经纪柜台系统解析:从今日国际金融动荡看证券交易核心引擎的变革
python·架构·系统架构·区块链·vim·柜台·香港券商
清空mega2 小时前
从零开始搭建 flask 博客实验(4)
后端·python·flask