1

我有以下问题:

我正在 django 中编写一个 AJAX 视图,该视图提供有关ImageSpecField来自 django-imagekit 扩展名的模型的图像列表的 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()

JSONConvertibleManager该模型使用自定义管理器使用内置的 Django 序列化程序(的实例)转换为 JSON(django.core.serializers)。

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

4

3 回答 3

4

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

我的模型:

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',)
于 2014-10-23T23:09:03.607 回答
2

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

thumbnail = serializers.ReadOnlyField(source="thumbnail.url")

拥有更多控制权(例如 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
于 2016-12-08T23:09:32.057 回答
1

基于@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 都会发生这种情况

于 2019-03-07T10:10:24.250 回答