使用django rest框架发布图像
我正在尝试为海洋船舶和船只制作一个简单的api,并使用django rest框架作为库来生成api。对于具有简单字段(如模型级别的字符字段和整数)的模型,一切都正常工作(创建、删除、更新、列表、获取) 问题在于,每当我试图发布一个包含图像的记录时,图像字段都不会被检测到。并且它总是导致错误“序列项1:预期字符串,未找到类型” 下面是我的模型、序列化程序和视图文件。 序列化程序使用django rest框架发布图像,django,api,django-rest-framework,Django,Api,Django Rest Framework,我正在尝试为海洋船舶和船只制作一个简单的api,并使用django rest框架作为库来生成api。对于具有简单字段(如模型级别的字符字段和整数)的模型,一切都正常工作(创建、删除、更新、列表、获取) 问题在于,每当我试图发布一个包含图像的记录时,图像字段都不会被检测到。并且它总是导致错误“序列项1:预期字符串,未找到类型” 下面是我的模型、序列化程序和视图文件。 序列化程序 class VesselSerializer(serializers.ModelSerializer): ima
class VesselSerializer(serializers.ModelSerializer):
image = serializers.ImageField(source='image')
class Meta:
model = Vessel
fields = ('image', 'id', 'vesselType', 'name')
class VesselTypeSerilizer(serializers.ModelSerializer):
class Meta:
model = VesselType
模型
def vessel_file_name(instance, filename):
return '/'.join(['vessels', instance.id, filename]) #the error is in this line
class VesselType(models.Model):
name = models.CharField(max_length=50)
class Vessel(models.Model):
name = models.CharField(max_length=50)
vesselType = models.ForeignKey(VesselType)
image = models.ImageField(upload_to=vessel_file_name, null=True)
def __unicode__(self):
return u'%s' % self.name
观点
还应注意,打印时request.FILES和request.DATA显示正确,但出现错误,表明尽管文件名出现在request.FILES中,但没有文件名
我被这个问题困扰了好几个小时,似乎找不到问题所在或我做错了什么。如果有任何帮助,我们将不胜感激。问题是,当调用
容器文件名
时,实例
对象不会保存到数据库中,实例.id
为无
从调试过程中可以清楚地看出,这就是问题所在,我试图回答的问题是为什么?一切似乎都正常,但由于某种原因,它没有保存,关于如何调试该问题的想法?从FileField
()的文档中,在大多数情况下,该对象尚未保存到数据库中,因此如果它使用默认的AutoField,它的主键字段可能还没有值。所以我的建议是:不要在文件路径中使用instance.id
。非常感谢@雅托夫
class VesselList(generics.ListCreateAPIView):
queryset = Vessel.objects.all()
serializer_class = VesselSerializer
fields = ('url', 'id', 'image', 'vesselType')
def post(self, request, format=None):
print 'entered here'
print '%' * 10
print request.DATA
print request.FILES
print '%' * 10
serializer = VesselSerializer(data=request.DATA, files=request.FILES)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class VesselDetails(generics.RetrieveUpdateDestroyAPIView):
queryset = Vessel.objects.all()
serializer_class = VesselSerializer