Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用django rest框架发布图像_Django_Api_Django Rest Framework - Fatal编程技术网

使用django rest框架发布图像

使用django rest框架发布图像,django,api,django-rest-framework,Django,Api,Django Rest Framework,我正在尝试为海洋船舶和船只制作一个简单的api,并使用django rest框架作为库来生成api。对于具有简单字段(如模型级别的字符字段和整数)的模型,一切都正常工作(创建、删除、更新、列表、获取) 问题在于,每当我试图发布一个包含图像的记录时,图像字段都不会被检测到。并且它总是导致错误“序列项1:预期字符串,未找到类型” 下面是我的模型、序列化程序和视图文件。 序列化程序 class VesselSerializer(serializers.ModelSerializer): ima

我正在尝试为海洋船舶和船只制作一个简单的api,并使用django rest框架作为库来生成api。对于具有简单字段(如模型级别的字符字段和整数)的模型,一切都正常工作(创建、删除、更新、列表、获取)

问题在于,每当我试图发布一个包含图像的记录时,图像字段都不会被检测到。并且它总是导致错误“序列项1:预期字符串,未找到类型”

下面是我的模型、序列化程序和视图文件。 序列化程序

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