为了允许非 dict 对象被序列化,将 safe 参数设置为 False

Jes*_*ica 4 python django angular

我使用 websocket 前端(Angular)后端(Django)创建实时聊天应用程序..我想将消息存储到 db(mySql)..当我尝试将消息数组从 Angular 存储到 django..它给我错误,如 500 内部server Eroor 并且为了允许非 dict 对象被序列化,将 safe 参数设置为 False。我在列表数组中发送消息数据..那么有什么问题吗?

模型.py

class msg(models.Model):
    name = models.ForeignKey(User, on_delete=models.CASCADE)
    receiver = models.CharField(max_length=20)
    text = models.CharField(max_length=1200)
    myDate = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)

序列化器.py

class MesSerializer(serializers.ModelSerializer):
    name = serializers.SlugRelatedField(many=False, slug_field='name', queryset=User.objects.all())
    receiver = serializers.SlugRelatedField(many=False, slug_field='name', queryset=User.objects.all())
    class Meta:
        model = msg
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

视图.py

class msg_list(APIView):
    def get(self, request, format=None):
        mes = msg.objects.all()
        serializer = MesSerializer(mes, many=True)  # convert into JSON
        return Response(serializer.data)

    def post(self, request, formate = None):
        data = JSONParser().parse(request) #type list
        serializer = MesSerializer(data= data, many = True) #type list
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)
Run Code Online (Sandbox Code Playgroud)

当我打开消息 api 时: 在此输入图像描述

小智 9

当我们从您的视图返回数据时JsonResponse(...),DjangoJsonResponse()期望您的 JSON 数据位于键:值对中。例如:

class Login(APIView):
     def get(self,request):
     ................
     token = 'abcd'
     return JsonResponse(token)
Run Code Online (Sandbox Code Playgroud)

但这里的变量token不是带有键:值对的字典,因此JsonResponse必须被告知“嘿,这不是常规键值,但这不是一个错误,我故意想以 json 形式发送单个值。”

因此,为了告诉我们,JsonResponse我们需要传递 set safe=False

class Login(APIView):
     def get(self,request):
     ................
     token = 'abcd'
     return JsonResponse(token, safe=False)
Run Code Online (Sandbox Code Playgroud)

如果您不想在 return 语句中指定这一点,则可以使用普通的Response().

class Login(APIView):
 def get(self,request):
 ................
 token = 'abcd'
 return Response(token)
Run Code Online (Sandbox Code Playgroud)