使用Django REST框架的通用类ListCreateAPIView
,我创建了一个端点,我认为该端点应该能够通过POST请求上传照片。我正在本教程中对代码进行建模。
到目前为止,我已经尝试使用Android和curl将文件发布到此终结点,并观察到相同的行为:创建了一条新记录,但未附加该文件。由于该文件是必填字段,因此服务器将返回500错误。
这个问题看起来很相似,但是他没有使用REST框架的通用视图,而且我不确定为什么...我想在适用的情况下利用它们。
这是我的Django视图:
class PhotoList(generics.ListCreateAPIView):
model = Photo
serializer_class = PhotoSerializer
permission_classes = [
permissions.AllowAny
]
...我的模特:
def get_unique_image_file_path(instance=None, filename='dummy.jpg'):
"""
function to determine where to save images. assigns a uuid (random string) to each and places it
in the images subdirectory below media. by default, we assume the file is a .jpg
"""
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext)
# TODO: 'images' is hard coded
return os.path.join('images', filename)
class Photo(models.Model):
post = models.ForeignKey(Post, related_name='photos', null=True, blank=True)
image = models.ImageField(upload_to=get_unique_image_file_path)
def get_image_abs_path(self):
return os.path.join(settings.MEDIA_ROOT, self.image.name)
...和我的序列化器:
class PhotoSerializer(serializers.ModelSerializer):
image = serializers.Field('image.url')
class Meta:
model = Photo
为了产生此行为,我使用以下curl
命令将消息发布到服务器(Android客户端代码完全相同):
curl --form image=@test_image.jpg http://localhost:8000/rest_tutorial/photos
进入generics.ListCreateAPIView
,该create()
方法如下所示:
# Copied from rest_framework.mixins.CreateModelMixin
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.DATA, files=request.FILES)
if serializer.is_valid():
self.pre_save(serializer.object)
self.object = serializer.save(force_insert=True)
self.post_save(self.object, created=True)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED,
headers=headers)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
当我在PyCharm的调试器中逐步执行上述代码时,可以清楚地在序列化器的init_files
字段中看到我的文件serializer.get_serializer()
。但是,序列化器的object
字段有很多回溯,但没有对我的图像文件的引用。也许这里有问题?
在self.object = serializer.save(force_insert=True)
使用空白图片字段创建记录后,文件不会上传,self.object.image.file
仅包含引用的回溯ValueError
。
有任何想法吗?谢谢!
我相信问题出在您的序列化器类中,您在其中将image
模型字段定义为Field
。泛型Field
是只读的,因此可能是问题的根源。尝试简单地从序列化程序中删除它,因为这是没有必要的:
class PhotoSerializer(serializers.ModelSerializer):
class Meta:
model = Photo
希望对您有所帮助,让我知道您的相处方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句