NEB*_*NEB 3 django django-rest-framework
Django 模型是:
class Post(models.Model):
name = models.CharField()
class PostImage(models.Model):
image = models.ImageField()
post = models.ForeignKey(
Post,
related_name=images,
)
Run Code Online (Sandbox Code Playgroud)
序列化器是:
class PostSerialiser(serializers.ModelSerializer):
name = serializers.CharField()
images = serializers.SlugRelatedField(
slug_field='image',
many=True,
read_only=True,
)
class Meta:
model = PostModel
fields = ('name' 'images',)
Run Code Online (Sandbox Code Playgroud)
串行器数据输出为:
[
{
"name": 'Name 1',
"images": [
<ImageFieldFile: 1.jpg>,
<ImageFieldFile: 2.jpg>,
],
},
{
"name": 'Name 2',
"images": [
<ImageFieldFile: 5.jpg>,
],
}
]
Run Code Online (Sandbox Code Playgroud)
但是当尝试获取相同数据的分页响应时,它会因错误而崩溃'ascii' codec can't decode byte 0xff in position 23: ordinal not in range(128)"
这是因为存在ImageFieldFile而不是 URL。
如何获取图像的绝对 url (MEDIA_URL+image-relative-url) 而不是ImageFieldFile?
能够弄清楚调查to_representation实施FileField。
class ImageUrlField(serializers.RelatedField):
def to_representation(self, instance):
url = instance.image.url
request = self.context.get('request', None)
if request is not None:
return request.build_absolute_uri(url)
return url
class PostSerialiser(serializers.ModelSerializer):
name = serializers.CharField()
images = serializers.ImageUrlField(many=True, read_only=True)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1301 次 |
| 最近记录: |