Django Rest框架 - 更改hyperlinkedmodel序列化程序

时间:2016-09-07 15:14:27

标签: python django-models django-rest-framework

我有一个使用DRF 1.8.x构建的Web服务,主要是模型驱动的。我的目的是在响应中为所有外键字段提供绝对URL,这包括正确的主机名(网关主机名)。但是,由于此api位于nginx网关后面,因此修改了主机名字段,并且向序列化程序实例发送上下文[' request']似乎没有帮助。

到目前为止,我使用装饰器修改主机名并处理自我url字段的基于版本的行为,但是forieign键字段仍然显示为api主机名。以下是我的代码:

serializers.py

class NodeSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.SerializerMethodField()

    class Meta:
        model = Node
        fields = ('url', 'name', 'description', 'owner', 'address', 
        'created', 'updated', 'endpoint')
        extra_kwargs= {
             'endpoint': {'view_name': 'loadbalancerendpoint-detail'},
             'owner': {'view_name': 'artifactowner-detail'}
          }

    @set_api_version_ref
    def get_url(self, obj):
        return self.context['request'].META.get('HTTP_REF')

装饰者 - set_api_version_ref

def set_api_version_ref(f):
    @functools.wraps(f)
    def wrapper(obj, ref):

        base_href = obj.context['request'].META.get('PATH_INFO', None)
        http_host = obj.context['request'].META.get('HTTP_X_HOST', None)
        '''
        Parse the incoming request URL to take API version in to a variable
        '''
        version_parse = re.search('\/myapi\/v(?P<version>(1(\.[0-1])?))\/\w+', base_href)
        api_version = version_parse.group('version')
        logger.debug("API Version detected: {}".format(api_version))
        href_suffix = base_href+str(ref.id)+"/"
        if http_host:
            href =  'https://'+http_host+href_suffix
            base_path = 'https://'+http_host+'/myapi/'+api_version+"/"
        else:
            href = href_suffix
            base_path = '/myapi/v'+api_version+"/"
        logger.debug("href assembled: {}".format(href))
        obj.context['request'].META['API_VERSION'] = api_version
        obj.context['request'].META['HTTP_REF'] = href
        obj.context['request'].META['BASE_PATH'] = base_path
        result = f(obj, ref)
        return result
    return wrapper

将extra_kwargs传递给相关的字段视图名称(loadbalancerendpoint-detail,artifactowner-detail等)似乎为我的pk提供了一个url,但我不知道如何修改其主机名而不使用它一个装饰者的方法,就像我为URL字段做的那样。非常感谢任何帮助,谢谢!

0 个答案:

没有答案