【问题标题】:Posting image with django rest framework使用 django rest 框架发布图像
【发布时间】:2014-05-14 19:30:59
【问题描述】:

我正在尝试为船舶和船舶制作一个简单的 api,并且我正在使用 django-rest-framework 作为库来生成 api。对于在模型级别具有简单字段(例如 char 字段和整数)的模型,一切都可以正常工作(创建、删除、更新、列出、获取)。

每当我尝试发布包含未检测到图像的记录时,图像字段都会出现问题。而且它总是会导致错误“序列项1:预期的字符串,找到NoneType”

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

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

观看次数

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

还需要注意的是,request.FILES和request.DATA在打印时显示正确,但出现错误,表明没有文件名,尽管名称出现在request.FILES中。

我被困在这个问题上几个小时,我似乎无法找到问题所在或我做错了什么。任何帮助将不胜感激。

【问题讨论】:

    标签: django api django-rest-framework


    【解决方案1】:

    问题是当vessel_file_name被调用时,instance对象没有保存到db,instance.idNone

    【讨论】:

    • 从调试过程中可以清楚地看出,我试图回答的问题是为什么会这样?一切似乎都井井有条,但由于某种原因它没有保存,关于如何调试问题的任何想法?
    • 来自FileField (docs.djangoproject.com/en/dev/ref/models/fields/…) 的文档 在大多数情况下,这个对象还没有保存到数据库中,所以如果它使用默认的 AutoField,它可能不会但它的主键字段有一个值。所以我的建议是:不要在文件路径中使用instance.id
    • 非常感谢。 @YAtOff
    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 2015-05-02
    • 2021-12-09
    • 2015-06-18
    • 1970-01-01
    • 2021-05-26
    • 2018-08-17
    相关资源
    最近更新 更多