如果用 Django REST Framework 的序列化器来序列化文件字段,能够返回绝对地址(即带有http://开头的全部URI),但缺点就是速度慢。
有测试表明, Django REST Framework 的序列化开销很大,尤其是 ModelSerializer,比直接用 .values 方法慢好几百倍。
如何用 .values 方法返回文件的绝对URL呢?
这里探索出一个解决方案:
from django.db.models import Q, Sum, F, Value, CharField
from django.db.models.functions import Concat
from django.conf import settings
User.objects.annotate(avatar_url=Concat(
Value(request._current_scheme_host + settings.MEDIA_URL),
F('avatar'),
output_field=CharField())
)
.values('avatar_url')
利用request._current_scheme_host
获取协议和host地址,然后利用 Concat
和Value
函数完成地址拼接,最后利用 annotate
实现变量命名。
网友评论