仅当参数context = {“ request”:request}添加到Base64ImageField时,Base64ImageField才返回完整的URL路径-还有其他方法吗

时间:2018-07-08 20:22:14

标签: django serialization django-rest-framework

我目前有一个Base64ImageField,它完全可以正常工作。我遇到的唯一问题是有时返回的路径不完整。它跳过域名,但是路径的其余部分都很好。它跳过域名的原因是因为我在序列化过程中没有传递参数context={"request": request}。原因是有时我没有访问权限到请求对象。换句话说,这很好

jsonObject = Serializer(model_instance,context={"request": request}).data

这会跳过图片字段中的域名

jsonObject = Serializer(model_instance).data

我的问题是,当我不需要请求对象时,如何使用第二个示例使它返回完整的url路径?还是我可以通过任何方式获取请求对象。什么时候不可用?

我的代码中有这个序列化器

class Serializer_Employer_TX(ModelSerializer):
    user = Serializer_User()
    employer_image = Base64ImageField(max_length=None, use_url=True, required=False)
    class Meta:
        model = modelEmployer
        fields = [
            'user',
            'employer_zip',
            'employer_image',
        ]

1 个答案:

答案 0 :(得分:1)

您可以使用sites framework,并覆盖Serializer_Employer_TX中的to_representation method

from django.contrib.sites.models import Site


class Serializer_Employer_TX(ModelSerializer):

    user = Serializer_User()
    employer_image = Base64ImageField(max_length=None, use_url=True, required=False)
    class Meta:
        model = modelEmployer
        fields = [
            'user',
            'employer_zip',
            'employer_image',
        ]

    def to_representation(self, instance):
        """Convert `username` to lowercase."""
        ret = super().to_representation(instance)
        if  not 'request' in self.context:
            # You can tweaks the url in here directly
            current_site = Site.objects.get_current().domain
            ret['employer_image'] = current_site + ret['employer_image']

        return ret

我希望这会有所帮助。