DRF中PrimaryKeyRelatedField需配置queryset的底层逻辑及相关疑问
问题解答
1. 可写关系字段必须指定queryset的底层逻辑
当关系字段设置为非只读(移除read_only=True)时,DRF需要处理前端传入的字段值,完成反序列化流程,这一流程依赖查询集完成两个核心动作:
- 输入合法性校验:前端传入的是关系对象的标识(例如
PrimaryKeyRelatedField接收的主键ID),DRF需要校验该标识是否对应真实存在、且允许当前用户关联的模型实例,校验的查找范围就是你显式传入的queryset。DRF不会默认使用全表查询作为查找范围,避免遗漏软删过滤、权限控制等业务逻辑,引发数据越权等安全问题。 - 实例转换赋值:反序列化最终要把前端传入的标识转换为Django ORM实例,才能正确赋值给模型的外键、多对多等关系字段,这一步也必须基于查询集从数据库中取出对应实例。
如果字段设置为read_only=True,该字段仅参与序列化输出,仅需要读取已有的关联实例数据格式化后返回,不需要处理任何前端传入的输入,因此不需要查询集参数。
2. StringRelatedField无该配置要求的原因
StringRelatedField从设计上就是只读序列化字段,DRF源码中它默认配置了read_only=True,且不支持修改为可写模式。它的唯一作用是在序列化阶段,调用关联模型实例的__str__方法,将实例转换为字符串输出,完全不参与反序列化的输入处理流程,不需要做实例查询、校验动作,因此不需要指定queryset参数。
内容的提问来源于stack exchange,提问作者AlwaysLearning
相关产品推荐
相关产品推荐

