Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
Python django imagekit-缩略图字段未序列化_Python_Json_Django_Serialization_Django Imagekit - Fatal编程技术网

Python django imagekit-缩略图字段未序列化

Python django imagekit-缩略图字段未序列化,python,json,django,serialization,django-imagekit,Python,Json,Django,Serialization,Django Imagekit,我有以下问题: 我正在django中编写一个AJAX视图,该视图为使用django imagekit扩展名的ImageSpecField的模型中有关图像列表的JSON数据提供服务: class Image(models.Model): title = models.CharField(max_length=120) img = models.ImageField(upload_to="images") thumb = ImageSpecField(source="img",

我有以下问题:

我正在django中编写一个AJAX视图,该视图为使用django imagekit扩展名的
ImageSpecField
的模型中有关图像列表的JSON数据提供服务:

class Image(models.Model):
   title = models.CharField(max_length=120)
   img = models.ImageField(upload_to="images")
   thumb = ImageSpecField(source="img",
       id="core:image:image_thumbnail"
     )
   objects = models.Manager()
   json_data = JSONConvertibleManager()
该模型使用自定义管理器,使用内置的Django序列化程序(Django.core.serializers的实例)将其转换为JSON(
JSONConvertibleManager


我的问题是,除了
ImageSpecField
完全被序列化之外,所有字段都被正确序列化。在序列化过程中是否可以返回
instance.thumb.url
值?

仅为获取信息,我使用了Django Rest框架,因此使用了该库中的序列化程序类

我的模型:

class Photo(models.Model):
    """ Photograph """
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=255)
    original_image = models.ImageField(upload_to='boxes')
    formatted_image = ImageSpecField(source='original_image', format='JPEG',
        options={'quality': 90})
    thumbnail = ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
        ResizeToFill(200, 115)], source='original_image',
        format='JPEG', options={'quality': 90})
    num_views = models.PositiveIntegerField(editable=False, default=0)
我的序列化程序:

class PhotoSerializer(serializers.ModelSerializer):
    original_image = serializers.Field('original_image.url')
    thumbnail = serializers.Field('thumbnail.url')

    class Meta:
        model = Photo
        fields = ('id', 'title', 'original_image', 'thumbnail',)

仅供参考,我使用的是Django Rest框架,因此使用了该库中的序列化程序类

我的模型:

class Photo(models.Model):
    """ Photograph """
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=255)
    original_image = models.ImageField(upload_to='boxes')
    formatted_image = ImageSpecField(source='original_image', format='JPEG',
        options={'quality': 90})
    thumbnail = ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
        ResizeToFill(200, 115)], source='original_image',
        format='JPEG', options={'quality': 90})
    num_views = models.PositiveIntegerField(editable=False, default=0)
我的序列化程序:

class PhotoSerializer(serializers.ModelSerializer):
    original_image = serializers.Field('original_image.url')
    thumbnail = serializers.Field('thumbnail.url')

    class Meta:
        model = Photo
        fields = ('id', 'title', 'original_image', 'thumbnail',)

不幸的是,由于DRF(prob.v2.x)的变化,被接受的答案不再有效。替换该行,它将适用于当前版本(3.5.3):

另一个具有更多控制(例如url修改)的解决方案是:

class PhotoSerializer(serializers.ModelSerializer):
    original_image = serializers.SerializerMethodField()

    class Meta:
        model = Photo
        fields = ('id', 'title', 'original_image')

    def get_original_image(self, obj):
        # some processing
        return obj.original_image.url

不幸的是,由于DRF(prob.v2.x)的变化,被接受的答案不再有效。替换该行,它将适用于当前版本(3.5.3):

另一个具有更多控制(例如url修改)的解决方案是:

class PhotoSerializer(serializers.ModelSerializer):
    original_image = serializers.SerializerMethodField()

    class Meta:
        model = Photo
        fields = ('id', 'title', 'original_image')

    def get_original_image(self, obj):
        # some processing
        return obj.original_image.url

基于@Insa给出的不错的解决方案的一点改进

class PhotoSerializer(serializers.ModelSerializer):
    original_image = serializers.SerializerMethodField()

    class Meta:
        model = Photo
        fields = ('id', 'title', 'original_image')

    def get_original_image(self, obj):
        if bool(obj.original_image):
            return self.context['request'].build_absolute_uri(obj.original_image.url)
        return ''

要获取缩略图的绝对url,默认情况下所有ImageFields都会这样做,

基于@Insa给出的漂亮解决方案,有一点改进

class PhotoSerializer(serializers.ModelSerializer):
    original_image = serializers.SerializerMethodField()

    class Meta:
        model = Photo
        fields = ('id', 'title', 'original_image')

    def get_original_image(self, obj):
        if bool(obj.original_image):
            return self.context['request'].build_absolute_uri(obj.original_image.url)
        return ''
获取缩略图的绝对url,默认情况下所有ImageFields都是如此