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

相关推荐
TechWayfarer10 小时前
攻防对抗:利用IP段归属查询工具快速封禁攻击源——3步联动防火墙(附脚本)
python·网络协议·tcp/ip·安全
m0_4939345310 小时前
Go语言中 & 与 - 的本质区别及指针使用详解
jvm·数据库·python
Greyson111 小时前
Redis如何解决哨兵通知延迟问题_优化客户端连接池动态刷新拓扑的订阅监听机制
jvm·数据库·python
深蓝海拓11 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十)框架初成的阶段总结
网络·笔记·python·学习·ui·plc
阿_旭11 小时前
基于YOLO26深度学习的【辣椒成熟度检测与计数系统】【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·辣椒成熟度检测
无风听海11 小时前
Python类型守卫深度解析
python
weixin_5806140012 小时前
如何防止SQL注入利用存储过程_确保存储过程不拼字符串.txt
jvm·数据库·python
weixin_4087177712 小时前
mysql权限表查询性能如何优化_MySQL系统权限缓存原理
jvm·数据库·python
吕源林12 小时前
怎么优化MongoDB的软删除设计_布尔标记与删除时间戳
jvm·数据库·python
吕源林12 小时前
如何解决SQL存储过程连接泄露_确保在异常后关闭连接
jvm·数据库·python