在Django Rest Framework中返回图片网址

New*_*wtt 10 python django django-rest-framework

我正在使用Django Rest Framework并具有以下模型:

class Picture(models.Model):
    some_field = models.ForeignKey(some_model)
    image = models.ImageField()
Run Code Online (Sandbox Code Playgroud)

我想写一个返回图像url的GET端点.这就是我到目前为止所做的

def get(self, request, aid):
    '''
    Get Image
    '''
    try:
        picture = Picture.objects.filter(some_field=aid)
    except Picture.DoesNotExist:
        raise Http404

    serialiser = PictureSerialiser(picture)
    return Response(serialiser.data)
Run Code Online (Sandbox Code Playgroud)

和我的Serialiser如下:

class PictureSerialiser(serializers.ModelSerializer):

    class Meta:
        model = Picture
        fields = ('field', 'image')
Run Code Online (Sandbox Code Playgroud)

我如何确保回复{field:'Value here', image:'url to image'}

Hai*_*ris 15

您可以使用自定义序列化方法执行此操作,如下所示:

class PictureSerialiser(serializers.ModelSerializer):

    image_url = serializers.SerializerMethodField('get_image_url')

    class Meta:
        model = Picture
        fields = ('field', 'image', 'image_url')

    def get_image_url(self, obj):
        return obj.image.url
Run Code Online (Sandbox Code Playgroud)


sad*_*ker 8

更新序列化程序中的图像字段use_url=True为我工作:

class PictureSerialiser(serializers.ModelSerializer):
    image = serializers.ImageField(
            max_length=None, use_url=True
        )
    class Meta:
        model = Picture
        fields = ('field', 'image')
Run Code Online (Sandbox Code Playgroud)

我无法获得当前接受的答案(向序列化程序添加自定义 get_image_url 方法)以在 Django 2.2 中工作。我收到错误消息,需要更新我的模型以包含字段 image_url。即使在更新模型后它也不起作用。


eng*_*rgh 7

提供的答案都是正确的,但我想在答案中添加一点,这是一种返回文件路径(包括站点地址)的方法。为此,我们从请求本身获得帮助:

class PictureSerialiser(serializers.ModelSerializer):

    image_url = serializers.SerializerMethodField('get_image_url')

    class Meta:
        model = Picture
        fields = ('field',
                  'image',
                  'image_url')

    def get_image_url(self, obj):
        request = self.context.get("request")
        return request.build_absolute_uri(obj.image.url)
Run Code Online (Sandbox Code Playgroud)