【问题标题】:non_field_errors : ["Expected a list of items but got type "dict"."]non_field_errors : ["期望一个项目列表,但得到类型 "dict"。"]
【发布时间】:2018-07-25 08:45:15
【问题描述】:

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

【问题讨论】:

  • 你需要将输入作为{"name":['adrian','yousof',..],"reciever":'test","text":"something","myDate":"2018-07-05"}
  • 我的输入正在传递 {name: "Erika", text: "hiii", receiver: "priyal", myDate: "2018-07-25T08:56:43.510Z"}
  • 就像你说的那样已经过去了
  • 名称值必须在列表中,因为 slugrelatedfield 需要项目列表,即使它是单个的

标签: python django angular


【解决方案1】:

麻烦不在于蛞蝓。当您将数据传递给序列化程序时,您在视图中使用了many = True,但实际上您只发送一条消息 - 这就是它是字典而不是列表的原因。删除该参数。

def post(self, request, formate = None):
    serializer = MesSerializer(data=request.data)

【讨论】:

    【解决方案2】:

    我最近遇到了一个类似于 OP 的问题。因此想分享一下我的经验和解决方案。

    我有一个项目字典,每一个都是独一无二的。我想使用 PUT 更新现有项目。所以我使用objects.filter 根据通过 JSON 请求传递的名称来获取对象(我知道我应该使用 pk,但我没有使用,因为这些项目是唯一的并且将保持如此)。然后我创建了一个 Django REST Serializer 类对象来保存更新的对象,但我失败了。这是因为我没有使用many = True。但是当我确实使用它时,我遇到了另一个错误:

    "non_field_errors": [
            "Expected a list of items but got type \"dict\"."
        ]
    

    所以我最终删除了many=Trueobjects.filter。 相反,我使用了objects.get。这解决了这个问题,因为objects.get 返回我想要更新的所需对象,而objects.filter 返回一个queryset 对象而不是我想要更新的实际对象。当然objects.get如果我有多个结果会失败,在这种情况下我需要确保有一个pk。再说一次,在我的情况下,objects.get 永远不会返回一个以上的对象。

    希望这篇文章对某人有所帮助并节省他们的大量时间。 :-)

    【讨论】:

    • 在给出长答案的同时,最好将其分成段落,打出要点并将您的代码标记为CODE-FORMAT。所有这些都使您的答案更易于阅读。
    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2023-04-07
    • 2021-11-26
    • 2022-12-05
    • 2022-01-03
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多