我使用websocket frontend(angular)backend(Django)创建实时聊天应用程序。我想将消息存储到db(mySql)..当我尝试将消息从angular存储到django ..它给我错误:
non_field_errors:
["Expected a list of items but got type "dict"."]
那怎么了?
model.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()
serializer.py
class MesSerializer(serializers.ModelSerializer):
name = serializers.SlugRelatedField(many=False, slug_field='name', queryset=User.objects.all())
class Meta:
model = msg
fields = '__all__'
view.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):
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)
答案 0 :(得分:2)
我最近遇到了一个与OP类似的问题。因此,我想分享我的经验和解决方案。
我有一个字典,每个字典都是唯一的。我想使用PUT更新现有项目。因此,我使用了 objects.filter 来基于通过JSON Request传递的名称来获取对象(我知道我应该使用pk,但我没有这么做,因为这些项是唯一的,并且将保持不变)。然后,我创建了一个Django REST Serializer类对象来保存更新的对象,但是失败了。这是因为我没有使用 many = True 。但是当我使用它时,我遇到了另一个错误 “ non_field_errors”:[ “期望项目列表,但输入类型为” dict“。” ] 因此,我最终删除了 many = True 和 objects.filter 。相反,我使用了 objects.get 。这解决了问题,因为 objects.get 返回我要更新的必需对象,而 objects.filter 返回的是 queryset 对象,而不是实际的我要更新的对象。当然,如果我有多个结果, objects.get 将会失败,在这种情况下,我需要确保有一个pk。再说一次,在我的情况下, objects.get 永远不会返回多个对象。
希望这篇文章对某人有帮助,并节省了很多时间。 :-)
答案 1 :(得分:1)
麻烦不在于the。这是因为您在将数据传递给序列化程序时在视图中使用了many = True
,但实际上您只发送了一条消息-这就是为什么它是字典而不是列表的原因。删除该参数。
def post(self, request, formate = None):
serializer = MesSerializer(data=request.data)