Django中Websocket结合HyperLinkedModelSerializer报错求助
问题解决:HyperlinkedIdentityField 需要 request 上下文的问题
为什么需要 request?
HyperlinkedModelSerializer 会为模型生成超链接类型的字段(比如默认的url字段),这类超链接需要基于当前请求的协议、域名等信息来构建完整的可访问URL,因此必须把request对象传入序列化器的上下文(context)中,否则无法生成合法的超链接地址。
解决方法
你不需要手动实例化序列化器(GenericAsyncAPIConsumer 会自动完成序列化器的实例化流程),只需要在消费者类中重写get_serializer_context方法,将request添加到上下文里即可:
修改后的消费者代码:
class Instructors_Consumer( ListModelMixin, RetrieveModelMixin, PatchModelMixin, UpdateModelMixin, CreateModelMixin, DeleteModelMixin, GenericAsyncAPIConsumer): queryset=Instructor.objects.all() serializer_class=InstructorSerializer def get_serializer_context(self): context = super().get_serializer_context() # 将当前请求对象注入序列化器上下文 context['request'] = self.scope['request'] return context
替代方案
如果你的业务场景不需要超链接字段,也可以直接将序列化器改为ModelSerializer,这样就不需要传入request上下文了:
class InstructorSerializer(serializers.ModelSerializer): class Meta: model=Instructor fields='__all__'
内容的提问来源于stack exchange,提问作者Owlet
相关产品推荐
相关产品推荐

