如何在 Django 中序列化 ImageField?

问题描述 投票:0回答:5

我正在尝试序列化我的一个带有

ImageField
的模型。内置序列化器似乎无法序列化它,因此我想到编写一个自定义序列化器。你能告诉我如何序列化图像并将其与 Django 中的默认 JSON 序列化器一起使用吗?

谢谢

python django json serialization django-models
5个回答
6
投票

你无法序列化该对象,因为它是一个图像。您必须序列化其路径的字符串表示形式。

实现它的最简单方法是在序列化它时调用它的 str() 方法。

json.dumps(unicode(my_imagefield)) # py2
json.dumps(str(my_imagefield)) # py3

应该可以。


5
投票

我编写了 simplejson 编码器的扩展。它不是将图像序列化为 base643,而是返回图像的路径。这是一个片段:

def encode_datetime(obj):
    """
    Extended encoder function that helps to serialize dates and images
    """
    if isinstance(obj, datetime.date):
        try:
            return obj.strftime('%Y-%m-%d')
        except ValueError, e:
            return ''

    if isinstance(obj, ImageFieldFile):
        try:
            return obj.path
        except ValueError, e:
            return ''

    raise TypeError(repr(obj) + " is not JSON serializable")

2
投票

您可以尝试使用 base64 编码 来序列化要在 JSON 中使用的图像


1
投票

使用另一个编码器:

import json
from django.core.serializers.json import DjangoJSONEncoder
from django.db.models.fields.files import ImageFieldFile


class ExtendedEncoder(DjangoJSONEncoder):
    def default(self, o):
        if isinstance(o, ImageFieldFile):
            return str(o)
        else:
            return super().default(o)


result = json.dumps(your_object, cls=ExtendedEncoder)

0
投票

我认为您可以使用 ContentFile 类将二进制数据处理到临时文件中,以便序列化程序可以处理它,直到将其传递给模型,您的模型将在媒体根和数据库中存储具有给定名称的实际图像将仅存储路径,我希望我下面写的示例会有所帮助。

from rest_framework.response import Response
from rest_framework import status
from django.core.files.base import ContentFile
import requests
#local imports
from .serializers import ImageSerializer


class ImageCreateAPIView(APIView):
    def post(self, request, *args, **kwargs):
        serializer = ImageSerializer(data=request.data)
        if serializer.is_valid():
            url = serializer.validated_data['url']
            response = requests.get(url).content
            image = ContentFile(response, name=url.split('/')[-1])
            serializer.validated_data['image'] = image
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

© www.soinside.com 2019 - 2024. All rights reserved.