python - 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()
- 序列化程序.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
- 视图.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)
我应该如何解决这个问题?
解决方案
您的问题来自ImgSerializer.create()
方法:
serializer.save()
将调用ImgSerializer.create()
,因为序列化程序未使用instance
关键字初始化。- 在序列化器创建方法中,
ImgSerializer(**validated_data)
构造新的序列化器实例,该实例将调用ModelSerializer.__init__
方法。但是由于您使用解包运算符 (**validated_data
),实际上您将title
,description
和image
关键字 args 传递给__init__
方法,方法无法识别这些参数。
因此ImgSerializer(**validated_data)
,您应该使用ImgSerializer(data=validated_data)
.
推荐阅读
- html - 关注表单时如何更改表单中输入标签的颜色?
- installshield - 如何将路径变量添加到从 MSI 转换的 Installshield 项目中的现有文件
- python - TypeError:“int”对象不是可下标的行
- javascript - 缓存图像的“过渡:不透明度 1”不起作用。如何替换 2 个“img”元素?
- hive - 在 Hive 中将一行单词分成单词组
- elasticsearch - Elasticsearch 2.4:如何连接 AND?
- vba - 画布的 MS-Word VBA Fit 方法
- regex - 从其中一个字段中有换行符的 URL 导入 CSV
- python - 如何从该列表中获取最后一列?
- html - SVG 在 Firefox 中完全不可见