序列化时如何手动设置属性“名称”

时间:2020-02-14 19:52:42

标签: django-models django-rest-framework

在我看来,答案很简单,但是我找不到它,使用DRF序列化时如何更改name属性?检查图像中的圆圈,我刚从DRF网站的“元数据”部分得到了它。

enter image description here

1 个答案:

答案 0 :(得分:1)

metadata [drf-doc]上的文档中所指定。您可能使用了SimpleMetadata class [GitHub]。在这里,我们看到这些选项是通过以下方式确定的:

    def determine_metadata(self, request, view):
        metadata = OrderedDict()
        metadata['name'] = view.get_view_name()
        metadata['description'] = view.get_view_description()
        metadata['renders'] = [renderer.media_type for renderer in view.renderer_classes]
        metadata['parses'] = [parser.media_type for parser in view.parser_classes]
        if hasattr(view, 'get_serializer'):
            actions = self.determine_actions(request, view)
            if actions:
                metadata['actions'] = actions
        return metadata

get_view_name of a APIView [GitHub]的实现方式为:

    def get_view_name(self):
        """
        Return the view name, as used in OPTIONS responses and in the
        browsable API.
        """
        func = self.settings.VIEW_NAME_FUNCTION
        return func(self)

settings因此将默认确定计算视图的函数的名称。由VIEW_NAME_FUNCTION setting [drf-doc]指定,默认为'rest_framework.views.get_view_name'

如果我们检查source code of this get_view_name function [GitHub],则会看到:

def get_view_name(view):
    """
    Given a view instance, return a textual name to represent the view.
    This name is used in the browsable API, and in OPTIONS responses.
    This function is the default for the `VIEW_NAME_FUNCTION` setting.
    """
    # Name may be set by some Views, such as a ViewSet.
    name = getattr(view, 'name', None)
    if name is not None:
        return name

    name = view.__class__.__name__
    name = formatting.remove_trailing_string(name, 'View')
    name = formatting.remove_trailing_string(name, 'ViewSet')
    name = formatting.camelcase_to_spaces(name)

    # Suffix may be set by some Views, such as a ViewSet.
    suffix = getattr(view, 'suffix', None)
    if suffix:
        name += ' ' + suffix

    return name

如果您的视图因此包含.name属性,它将使用该属性作为名称。因此,您可以将APIView实施为:

class SomeAPIView(APIView):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.name = 'Another name than To Do List'

如果没有name属性,它将使用视图的名称,尝试删除后缀ViewViewSet,将驼峰式大小写转换为空格,然后可选地添加后缀(例如'List'的{​​{1}})。

相关问题