首页 > 解决方案 > serializer.py 的 Django REST 框架问题

问题描述

我正在尝试使用 Postman 的 POST 方法保存一些数据,例如 Image 和信息。但是我得到了一个错误:init () 得到了一个意外的关键字参数'title'。这是我的代码:

1.models.py

from django.db import models
class Images(models.Model):
    title = models.CharField(max_length=100)
    description = models.CharField(max_length=100)
    image = models.ImageField()
  1. 序列化程序.py
from rest_framework import serializers
from .models import Images

class ImgSerializer(serializers.ModelSerializer):
    class Meta:
        model = Images
        fields = ["title", "description", "image"]

    def create(self, validated_data):
        return ImgSerializer(**validated_data)

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title', instance.title)
        instance.description = validated_data.get('description', instance.description)
        instance.save()
        return instance
  1. 视图.py
class ImgApi(APIView):
    parser_classes = (MultiPartParser, FormParser)
    def post(self, request):
        serializer = ImgSerializer(data=request.data)
        if serializer.is_valid():
            try:
                serializer.save()
            except Exception as e:
                logger.error(e)
                return Response(data={'msg':f'{e}'},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
            return Response(data=json_data,
                            status=status.HTTP_201_CREATED)

邮递员中的事情: 邮递员的事

我应该如何解决这个问题?

标签: pythondjangodjango-rest-framework

解决方案


您的问题来自ImgSerializer.create()方法:

  • serializer.save()将调用ImgSerializer.create(),因为序列化程序未使用instance关键字初始化。
  • 在序列化器创建方法中,ImgSerializer(**validated_data)构造新的序列化器实例,该实例将调用ModelSerializer.__init__方法。但是由于您使用解包运算符 ( **validated_data),实际上您将title,descriptionimage关键字 args 传递给__init__方法,方法无法识别这些参数。

因此ImgSerializer(**validated_data),您应该使用ImgSerializer(data=validated_data).


推荐阅读