Изменить возвращаемую по умолчанию информацию платформы Django Rest ModelViewSet.

Django

Интерфейс API drf возвращает только строку данных JSON по умолчанию, он не содержит другой информации об интерфейсе, и даже иногда формат несовместим, что не очень удобно для внешнего интерфейса, поэтому я надеюсь изменить этот возврат и добавить некоторая дополнительная информация к возвращаемой информации. информация, такая какусловие,иллюстрироватьДополнительная информация

Прежде всего, чтобы узнать, где изменить этот возврат, просмотрите исходный код и обнаружите, что информация о возврате написана наcreate(),list(),retrieve(),update(),destroy()В этих методах эта информация помещается вResponseОбъект возвращается на главную страницу.

После того, как вы узнали, что нужно изменить, следующим шагом будет изменение возвращаемой информации этих методов.Я надеюсь вернуть информацию в этом формате во внешний интерфейс:

{'code': 1, 'msg': 'success', 'errors': {}, 'data': []} # ошибки помещают конкретную информацию об ошибке, данные помещают возвращенные данные

Затем используйте этот словарь для прямой замены информации в ответе следующим образом:

这里就放一张,其它的类似修改

После замены пробуем запросить интерфейс, и формат возврата по умолчанию становится тем, что мы определили.Однако задача не выполнена.В случае только одного интерфейса менять его нечего, но если их больше чем дюжина, дюжина Если вы хотите менять интерфейсы один за другим, это не только утомительно, но и сложно в обслуживании, поэтому вот другой метод.

Мы делаем это, определяя класс, который наследуется от ModelViewSet, и тогда все интерфейсы больше не наследуются от ModelViewSet, а наследуются от этогоCustomViewSet, который не нужно менять по одному, а также он прост в обслуживании.

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

Через некоторое время отладки я обнаружил, что когда в интерфейсе возникает исключение, оно вызваноexception_handlerобрабатывается таким образом. Этот метод определен вrest_framework/views.py, поскольку этот метод является независимым и не определен в ModelViewSet, поэтому нет возможности изменить его, переопределив метод, мы копируем весь метод и помещаем его вCustomViewSetВнизу (разумеется, нет необходимости ставить их вместе, можно ставить куда угодно, лишь бы это было удобно для управления).

Видно, что в строках с 95 по 98 нам нужно изменить, отладить, чтобы увидеть, как выглядит этот объект, а затем дополнительно извлечь из него нужную нам информацию и изменить ее на это:

Самый важный шаг! быть вsettings.pyвнутриREST_FRAMEWORKДобавьте еще одну подобную конфигурацию в (добавлено вами):

REST_FRAMEWORK = {
    ······
    ······
    
    'EXCEPTION_HANDLER': 'common.views.exception_handler'
}

Указывает, какой метод использовать в качестве обработчика исключений интерфейса.Это тот, который мы только что изменили.

PS: Хотя большая часть возвращаемой информации о системе была изменена после вышеупомянутой модификации, иногда нам нужно определить интерфейс, который не наследует ModelViewSet, чтобы эти модификации не могли быть унаследованы.В этом случае каждый раз, когда мы пишем интерфейс, вы нужно снова ввести эту информацию вручную, неизбежно, что вы введете неправильно, здесь я определяю класс:

Затем приведенный выше интерфейс можно изменить на такой, более удобный в обслуживании:

Суммировать:

  1. Пользовательский наследуется отModelViewSetкласс, переопределитьcreate,list,update,retrieve,destroyЭти методы изменяют ответ
  2. копироватьrest_framework/views.py/exception_handlerметод, измените код, который обрабатывает информацию об исключении
  3. существуетsettings.pyизREST_FRAMEWORKдобавить в конфигурацию'EXCEPTION_HANDLER': 'common.views.exception_handler'
  4. (Необязательно) Создайте новый класс возвращаемой информации.ResturnMsgвместо того, чтобы вручную записывать возвращаемую информацию во избежание ошибок.