我定义了一个简单的Django应用程序,包括以下模型:

class Project(models.Model):
    name = models.CharField(max_length=200)
    thumbnail = models.FileField(upload_to='media', null=True)

(从技术上讲,是的,那可能是ImageField.)

在模板中,很容易将MEDIA_URL值(适当编码在settings.py中)作为缩略图URL的前缀.以下各项工作正常:

<div id="thumbnail"><img src="{{ MEDIA_URL }}{{ current_project.thumbnail }}" alt="thumbnail" width="400" height="300" border="0" /></div>

使用DRF,我定义了一个名为ProjectSerializer的HyperlinkedModelSerializer子代:

class ProjectSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Project
        fields = ( 'id' ,'url', 'name', 'thumbnail')

我已经定义了一个非常简单的ModelViewSet后代:

class ProjectViewSet(viewsets.ModelViewSet):
    queryset = Project.objects.all()
    serializer_class = ProjectSerializer

生成的JSON示例如下所示:

{
    "id": 1, 
    "url": "http://localhost:8000/api/v1/projects/1/", 
    "name": "Institutional", 
    "thumbnail": "media/institutional_thumb_1.jpg"
}

我还没有想出如何在我的项目的JSON表示中提供包含图像完整url的缩略图字段.

我认为我需要在ProjectSerializer中创建一个自定义字段,但没有成功.

推荐答案

试试SerializerMethodField

示例(未经测试):

class MySerializer(serializers.ModelSerializer):
    thumbnail_url = serializers.SerializerMethodField('get_thumbnail_url')

    def get_thumbnail_url(self, obj):
        return self.context['request'].build_absolute_uri(obj.thumbnail_url)

请求必须对序列化程序可用,以便它可以为您构建完整的绝对URL.一种方法是在创建序列化程序时显式传递它,类似于:

serializer = MySerializer(account, context={'request': request})

Django相关问答推荐

如何在Django中更改模型字段名称?

如何在Django模型mixin字段定义中引用模型名称?

如何显示日期?

Django modelform在包含在另一个模板中时不呈现

我的Django终结点不访问HAS_OBJECT_PERMISSION方法

试图找出投票的总数,但无法理解它是如何在序列化器中完成的.我是Django的新手,它是如何完成的?

社工/社工简戈

如何在Django中显示多个相关对象

Django-表单(ModelForm)中的数据不保存在现有数据库中

Django中用于外键的嵌套循环

如何让两个模型相互引用 Django

如何获得用户权限?

InvalidBasesError:无法解析 [] 的基础

Django,如何从模型表单的 Select 字段中删除空白 Select ?

我应该如何在我的模型中使用 DurationField?

Django manage.py:在其依赖之前应用迁移

模型表格Save保存,Get获取保存的对象

Django:验证上传文件的文件类型

访问 django 管理模板中的对象

django.urls.path中name参数的作用是什么?