Django gRPC Framework List接口返回非stream repeated消息序列化失败问题
问题原因
你遇到的序列化报错不是gRPC本身不支持一次性返回数组,而是Django gRPC framework的ModelService默认的List逻辑和你定义的返回消息结构不匹配:ModelService处理非流式List请求时,需要明确知道序列化后的组织列表要放到你自定义的Organizations消息的哪个字段里,你没有配置对应参数,框架无法正确组装返回消息,就会触发序列化失败错误。
而流式返回时框架不需要封装外层的Organizations消息,直接逐行返回单个Organization对象,所以不会出现匹配问题。
解决方案
直接修改你的services.py,新增两个配置项即可,不需要改动现有proto定义:
import org_pb2 # 确保你已经导入了生成的proto类 class OrganizationService(generics.ModelService): queryset = Organization.objects.all() serializer_class = OrganizationSerializerProto # 新增以下两行配置 list_response_proto_class = org_pb2.Organizations list_response_field_name = "organization"
参数说明:
list_response_proto_class:指定List接口返回的外层消息类,也就是你自己定义的Organizations对应的proto类list_response_field_name:指定序列化后的列表数据要放到外层消息的哪个字段下,这里对应你Organizations里定义的organization字段
修改完成后重启服务,再调用非流式的List接口即可正常一次性返回所有组织列表。
内容的提问来源于stack exchange,提问作者Hasan Gilani
相关产品推荐
相关产品推荐

