non_field_errors:[“预期项目列表,但类型为“ dict”。”]

时间:2018-07-25 08:45:16

标签: python django angular

我使用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)

2 个答案:

答案 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)