Django序列化器中PrimaryKeyRelatedField为何需要指定queryset
解答
官方文档的中文翻译为:
该查询集用于在校验字段输入时查找对应的模型实例
之所以要求传入queryset参数,核心有两个原因:
- 做输入合法性校验
前端传的外键参数只是一个整数ID,DRF需要先验证这个ID对应的Abc实例确实存在,避免写入不存在的外键值触发数据库层面的错误。你传入的queryset就是DRF校验时的查询范围,你也可以自定义查询集实现权限控制,比如写queryset=Abc.objects.filter(owner=current_user),就能限制用户只能关联自己有权限的Abc对象,灵活度更高。 - 自动转换为模型实例
校验通过后,DRF会自动把你传入的ID转换为对应的Abc实例,直接注入到validated_data中。你在create方法里不需要手动编写Abc.objects.get(id=xxx)的查询逻辑,也不需要自己处理实例不存在的异常,大幅简化了代码。
另外补充:如果你的序列化器没有显式覆写abc字段,ModelSerializer会自动根据模型的外键定义生成对应的PrimaryKeyRelatedField,默认携带queryset=Abc.objects.all(),不需要你手动传入。只有你手动覆写字段定义的时候,才需要显式指定queryset。
而GET请求设置read_only=True后,该字段仅负责把数据库中已有的外键实例序列化为ID返回,不需要接收前端输入,也就不需要做输入校验和实例转换,自然不需要传入queryset。
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

