2 回答

TA贡献1824条经验 获得超6个赞
您需要添加额外的字段SerializerMethodField:
class UserSerializer(serializers.ModelSerializer):
icon_url = serializers.SerializerMethodField()
class Meta:
model = UserAccount
fields = (..., 'icon_url')
def get_icon_url(self, user_account):
request = self.context.get('request')
icon_url = user_account.icon.url
return request.build_absolute_uri(icon_url)
并添加request到上下文中:
def get(self, request):
...
userAccount = user.userAccount
serializer = UserSerializer(userAccount, context={'request':request})
return Response(serializer.data)

TA贡献1850条经验 获得超11个赞
请参阅更新的部分。
出于同样的目的,我创建了一个可以在序列化程序类上继承的可重用 mixin。
from django.db.models import FileField, ImageField
def get_full_url(request, path):
"""Get full url with respect to current scheme"""
url = request.scheme + "://" + request.get_host() + path
return url
class FileFullPathSerializerMixins:
def to_representation(self, instance):
request = self.context['request']
data = super().to_representation(instance)
for field in instance._meta.fields:
# returns the full file path for the below instance db cols
if field.__class__ in [FileField, ImageField]:
field_val = getattr(instance, field.name).name
if field_val:
data[field.name] = get_full_url(request, field_val)
return data
用法示例:
class UserProfileSerializer(FileFullPathSerializerMixins,serializers.ModelSerializer):
class Meta:
model = User
fields = ('first_name', 'last_name', 'avatar', 'email')
extra_kwargs = {
'email': {'read_only': True}
}
注意事项:确保将请求作为视图集中的上下文传递为:
class UserProfileViewSet(viewsets.ModelViewSet):
serializer_class = UserProfileSerializer
def get_serializer_context(self):
context = super(UserProfileViewSet, self).get_serializer_context()
context.update({"request": self.request})
return context
更新: 如果您在序列化程序字段中使用 FileField 或 ImageField。无需修改实际响应。
class FooSerializer(serializers.Serializer):
image = serializers.ImageField(source='image_field')
file = serializers.ImageField(source='file_field')
to_representation如果您在序列化程序中使用 ImageField 或 FileField,则无需使用方法手动修改 api 响应的内部表示。只需将请求作为上下文传递给序列化程序就可以正常工作,否则上述方法效果很好。
添加回答
举报