Как вручную установить атрибут «имя» при сериализации - PullRequest
2 голосов
/ 14 февраля 2020

мне кажется, что ответ довольно прост, но мне не удалось его найти, как мне изменить атрибут имени при сериализации с использованием DRF? Проверьте круг на изображении, я только что получил его с веб-сайта DRF в разделе метаданных.

enter image description here

1 Ответ

1 голос
/ 14 февраля 2020

Как указано в документации на метаданные [drf-doc] . Вы, вероятно, используете класс SimpleMetadata [GitHub] . Здесь мы видим, что параметры определяются следующим образом:

    def determine_metadata(self, request, view):
        metadata = OrderedDict()
        <b>metadata['name'] = view.get_view_name()</b>
        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 для APIView [GitHub] реализован как:

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

Таким образом, settings будет по умолчанию определять имя функции, которая вычисляет представление. Это определяется настройкой VIEW_NAME_FUNCTION [drf-doc] , по умолчанию 'rest_framework.views.get_view_name'.

Если мы проверяем исходный код этого 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 = <b>getattr(view, 'name', None)</b>
    if name is not None:
        return <b>name</b>

    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)
        <b>self.name = 'Another name than To Do List'</b>

Если атрибута name нет, он, таким образом, примет имя представления, попытайтесь избавиться от View или ViewSet суффикс, преобразуйте верблюд в пробелы и при необходимости добавьте суффикс (например, 'List' для ListAPIView).

...