我有以下问题:
我正在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序列化程序(JSONConvertibleManager
的实例)转换为JSON(django.core.serializers
)。
我的问题是所有字段都已正确序列化,除了完全省略的ImageSpecField
。是否可以在序列化期间返回instance.thumb.url
值?
答案 0 :(得分:3)
仅供参考,我使用的是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',)
答案 1 :(得分:1)
不幸的是,由于DRF(prob.v2.x)的变化,接受的答案不再起作用。替换此行,它将适用于当前版本(3.5.3):
thumbnail = serializers.ReadOnlyField(source="thumbnail.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
答案 2 :(得分:0)
基于@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,默认情况下,所有ImageField都将发生