我使用 websocket 前端( Angular )后端(Django)创建实时聊天应用程序..我想将消息存储到数据库(mySql)..当我尝试将消息数组从 Angular 存储到 django 时..它给了我错误像 500 内部服务器 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()
序列化器.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__'
查看.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)
最佳答案
序列化前不需要解析请求。只需传递 request.data
作为序列化器参数:
def post(self, request, formate = None):
serializer = MesSerializer(data=request.data, many=True) #type list
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
UPD
receiver
是 CharField,因此您不能对其使用 SlugRelatedField
。只需在序列化器中使用默认的 CharField
即可:
class MesSerializer(serializers.ModelSerializer):
name = serializers.SlugRelatedField(many=False, slug_field='name', queryset=User.objects.all())
class Meta:
model = msg
fields = '__all__'
关于python - 为了允许非 dict 对象被序列化,将 safe 参数设置为 False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51511813/