Руководство по API Django REST framework (10): Поля сериализации

задняя часть Python Django

Официальная оригинальная ссылка
Эта серия статей адрес github
Пожалуйста, укажите источник

Поле сериализатора

Каждое поле в классе Form отвечает не только за проверку данных, но и за их «очистку» — приведение их в согласованный формат.

Документация Джанго

Поля сериализации обрабатывают преобразование между примитивными типами данных и другими типами данных (например, пользовательскими классами). Они также могут проверять данные, а также извлекать и устанавливать значения из своих родительских объектов.


Уведомление:Сериализованные поля объявлены вfields.py, но по соглашению следует использоватьfrom rest_framework import serializersи использоватьserializers.<FieldName>способ цитирования.


основные параметры

Конструктор каждого класса сериализованного поля требует некоторых параметров. Некоторым классам полей требуются дополнительные параметры, специфичные для поля, но они всегда должны принимать следующие параметры:

read_only

Поля только для чтения включены в выходные API и не должны включаться во входные API, которые требуют операций создания или обновления. Неправильное включение 'read_only' в сериализованный ввод класса будет проигнорировано.

установить его наTrueЭто поле гарантированно будет использоваться при сериализации представления, но не при создании или обновлении экземпляра во время десериализации.

По умолчаниюFalse

write_only

установить его наTrueчтобы убедиться, что поле доступно при обновлении или создании экземпляра, но не при сериализации представления.

По умолчаниюFalse

required

Ошибка обычно возникает, если предоставленное поле отсутствует во время десериализации. Должно быть установлено значение false, если это поле не требуется во время десериализации.

установите это наFalseТакже позволяет исключить из вывода свойства объекта или ключи словаря при сериализации экземпляра. Если ключ не существует, он не будет включен в выходное представление.

По умолчаниюTrue

allow_null

если поставитьNoneПередается в сериализованные поля, обычно выдает ошибку. еслиNoneследует рассматривать как допустимое значение, установите для этого ключевого аргумента значениеTrue.

Обратите внимание, что установка этого параметра вTrueбудет означать, что по умолчанию для сериализованного выводаnull, но не подразумевает значение по умолчанию для десериализации ввода.

По умолчаниюFalse

default

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

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

Может быть установлен в функцию или другой вызываемый объект, и в этом случае он будет вызываться каждый раз, когда используется значение. При вызове он не получает аргументов. Если вызываемый объект имеетset_contextМетод вызывается каждый раз перед получением значения экземпляра поля в качестве параметра. Это работает так же, как валидатор.

При сериализации экземпляра, если свойство объекта или ключ словаря не существует в экземпляре, будет использоваться значение по умолчанию.

Обратите внимание, что установка значения по умолчанию означает, что поле не является обязательным. также включаютdefaultиrequiredАргументы ключевого слова недействительны и вызовут ошибку.

source

Имя свойства, которое будет использоваться для заполнения поля. может быть только акцептомselfметоды с параметрами, такими какURLField(source='get_absolute_url')или используйте точечную нотацию для перебора таких свойств, какEmailField(source='user.email'). При использовании записи через точку вам может потребоваться указать значение по умолчанию, если какой-либо объект не существует или пуст во время обхода свойства.

source ='*'Имеет особое значение, чтобы указать, что в это поле должен быть передан весь объект. Это полезно для создания вложенных представлений или для полей, которым требуется доступ к полному объекту для определения выходного представления.

По умолчанию используется имя поля.

validators

Список функций проверки, которые должны быть применены к входящему вводу поля, что должно привести к ошибке проверки или просто возврату. Функции валидатора обычно должны подниматьserializers.ValidationError, но встроенный в DjangoValidationErrorТакже поддерживается совместимость с валидаторами, определенными в кодовой базе Django или сторонними пакетами Django.

error_messages

Словарь, ключ — это код ошибки, а значение — соответствующее сообщение об ошибке.

label

Короткая текстовая строка, которую можно использовать в качестве имени поля в поле HTML-формы или другого описательного элемента.

help_text

Текстовая строка, которую можно использовать в качестве описания поля в поле HTML-формы или другого описательного элемента.

initial

Значение, которое следует использовать для предварительного заполнения полей формы HTML. Вы можете передать вызываемый объект, как и любой обычный Django.Fieldделает то же самое:

import datetime
from rest_framework import serializers
class ExampleSerializer(serializers.Serializer):
    day = serializers.DateField(initial=datetime.date.today)

style

Словарь пар ключ-значение, который можно использовать для управления отображаемыми полями средства визуализации.

Вот два примера'input_type'и'base_template':

# Use <input type="password"> for the input.
password = serializers.CharField(
    style={'input_type': 'password'}
)

# Use a radio input instead of a select input.
color_channel = serializers.ChoiceField(
    choices=['red', 'green', 'blue'],
    style={'base_template': 'radio.html'}
)

Логическое поле

BooleanField

Представляет логическое значение.

Обратите внимание, что при использовании форм с кодировкой HTML пропуск логического значения рассматривается как установка поля наFalse, хотя и указываетdefault=Trueопции. Это связано с тем, что флажки HTML обозначают непроверенное состояние, опуская значение, поэтому платформа REST рассматривает пропуски как пустые флажки.

Обратите внимание, что будет использоватьсяrequired=Falseвозможность генерировать по умолчаниюBooleanFieldэкземпляр (начиная с Djangomodels.BooleanFieldвсегдаblank=True). Если вы хотите изменить это поведение, объявите его явно в классе сериализации.BooleanField.

соответствуетdjango.db.models.fields.BooleanField.

подписать: BooleanField()

NullBooleanField

представляет логическое значение, которое также принимаетNoneкак действительное значение.

соответствуетdjango.db.models.fields.NullBooleanField.

подписать: NullBooleanField()


строковое поле

CharField

Представляет текст. можно использоватьmax_length,min_lengthПодтвердите (или уточните) длину текста.

соответствуетdjango.db.models.fields.CharFieldилиdjango.db.models.fields.TextField.

подписать: CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)

  • max_length- Убедитесь, что ввод не содержит больше указанного количества символов.
  • min_length- Убедитесь, что ввод содержит не менее указанного количества символов.
  • allow_blank- если установленоTrue, пустая строка должна считаться допустимым значением. Если установленоFalse, то пустая строка считается недопустимой и возникает ошибка проверки. По умолчаниюFalse.
  • trim_whitespace- если установленоTrue, начальные и конечные пробелы будут удалены. По умолчаниюTrue.

allow_nullопция также доступна для строковых полей, хотя она относится кallow_blankНе рекомендуется. установить в то же времяallow_blank=Trueиallow_null=Trueдопустимо, но это означает, что строковое представление допускает два разных типа пустых значений, что может привести к несогласованности данных и незаметным ошибкам приложения.

EmailField

Представляет текст, проверяя текст как действительный адрес электронной почты.

соответствуетdjango.db.models.fields.EmailField

подписать: EmailField(max_length=None, min_length=None, allow_blank=False)

RegexField

Представляет текст для проверки соответствия заданного значения регулярному выражению.

соответствуетdjango.forms.fields.RegexField.

подписать: RegexField(regex, max_length=None, min_length=None, allow_blank=False)

обязательныйregexАргумент может быть строкой или скомпилированным объектом регулярного выражения Python.

Использование Джангоdjango.core.validators.RegexValidatorаутентификация.

SlugField

один по образцу[a-zA-Z0-9_-]+Проверьте вводRegexField.

соответствуетdjango.db.models.fields.SlugField.

подписать: SlugField(max_length=50, min_length=None, allow_blank=False)

URLField

Тот, который проверяет ввод по шаблону сопоставления URL.RegexField. Полный формат URL-адреса:http://<host>/<path>.

соответствуетdjango.db.models.fields.URLField, Использование Джангоdjango.core.validators.URLValidatorаутентификация.

подписать: URLField(max_length=200, min_length=None, allow_blank=False)

UUIDField

Убедитесь, что поле ввода является допустимой строкой UUID.to_internal_valueметод вернетuuid.UUIDпример. На выходе поле вернет строку в каноническом формате дефиса, например:

"de305d54-75b4-431b-adb2-eb6b9e546013"

подписать: UUIDField(format='hex_verbose')

  • format: определить представление значения uuid
    • 'hex_verbose'- Авторитетное шестнадцатеричное представление, включая дефисы:"5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
    • 'hex'- компактное шестнадцатеричное представление, исключая дефисы:"5ce0e9a55ffa654bcee01238041fb31a"
    • 'int'- 128-битное целочисленное представление:"123456789012312313134124512351145145114"
    • 'urn'- Представление RFC 4122 URN:"urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"ИсправлятьformatВлияет только на значение представления. Все форматыto_internal_valueпринимать.

FilePathField

Поле, параметры которого ограничены именами файлов в каталоге файловой системы.

соответствуетdjango.forms.fields.FilePathField.

подписать: FilePathField(path, match=None, recursive=False, allow_files=True, allow_folders=False, required=None, **kwargs)

  • path- Абсолютный путь в файловой системе к каталогу, из которого должно выбираться FilePathField.
  • match- Регулярное выражение, используемое для фильтрации имен файлов, строкового типа.
  • recursive- Указывает, должны ли быть включены все подкаталоги пути. Значение по умолчаниюFalse.
  • allow_files- Должен ли быть включен файл в указанном месте. По умолчаниюTrue. этот параметр илиallow_foldersдолжно бытьTrue. (Одно из двух свойств должно бытьtrue)
  • allow_folders- Должна ли быть включена папка в указанном месте. Значение по умолчаниюFalse. этот параметр илиallow_filesдолжно бытьTrue. (Одно из двух свойств должно бытьtrue)

IPAddressField

Убедитесь, что ввод является допустимой строкой IPv4 или IPv6.

соответствуетdjango.forms.fields.IPAddressFieldиdjango.forms.fields.GenericIPAddressField.

подписать: IPAddressField(protocol='both', unpack_ipv4=False, **options)

  • protocolОграничить допустимый ввод указанным протоколом. Принятое значение'both'(дефолт),'IPv4'или'IPv6'. Сопоставление не чувствительно к регистру.
  • unpack_ipv4Распаковать сопоставленные IPv4-адреса, такие как::ffff:192.0.2.1. Если эта опция включена, адрес будет распакован на 192.0.2.1. По умолчанию отключено. только вprotocolУстановить как'both'при использовании.

числовое поле

IntegerField

Представляет целое число.

соответствуетdjango.db.models.fields.IntegerField, django.db.models.fields.SmallIntegerField, django.db.models.fields.PositiveIntegerFieldиdjango.db.models.fields.PositiveSmallIntegerField.

подписать: IntegerField(max_value=None, min_value=None)

  • max_valueУбедитесь, что предоставленное число не больше этого значения.
  • min_valueУбедитесь, что предоставленное число не меньше этого значения.

FloatField

Представление с плавающей запятой.

соответствуетdjango.db.models.fields.FloatField.

подписать: FloatField(max_value=None, min_value=None)

  • max_valueУбедитесь, что предоставленное число не больше этого значения.
  • min_valueУбедитесь, что предоставленное число не меньше этого значения.

DecimalField

Представляет десятичное число, используемое PythonDecimalпредставление экземпляра.

соответствуетdjango.db.models.fields.DecimalField.

подписать: DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None)

  • max_digitsМаксимально допустимое количество цифр. Это должно бытьNoneили больше или равноdecimal_placesцелое число.
  • decimal_placesКоличество десятичных разрядов.
  • coerce_to_stringЕсли должно быть возвращено строковое значение, установите значениеTrue; если должен вернутьсяDecimalобъект, установленный наFalse. Значение по умолчанию такое же, какCOERCE_DECIMAL_TO_STRINGЗначение ключа настроек такое же, если не переопределить, значение будетTrue. Если сериализованный объект возвращаетDecimalобъект, окончательный выходной формат будет определяться визуализатором. Обратите внимание, что настройкаlocalizeзаставит значение бытьTrue.
  • max_valueУбедитесь, что предоставленное число не больше этого значения.
  • min_valueУбедитесь, что предоставленное число не меньше этого значения.
  • localizeУстановить какTrueчтобы включить локализацию ввода и вывода на основе текущей локали. Это также заставитcoerce_to_stringзаTrue. По умолчаниюFalse. Обратите внимание, что если вы установите в файле настроекUSE_L10N=True, форматирование данных включено.
  • roundingУстановите режим округления, используемый при квантовании точности конфигурации. Допустимое значениеdecimalБлочный режим округления. По умолчаниюNone.

Пример использования

Чтобы проверить число до 999 с двумя десятичными знаками, вы должны использовать:

serializers.DecimalField(max_digits=5, decimal_places=2)

Используйте 10 знаков после запятой, чтобы убедиться, что число не превышает 1 миллиард:

serializers.DecimalField(max_digits=19, decimal_places=10)

Это поле также принимает необязательный параметр,coerce_to_string. Если установленоTrue, это означает, что он будет выведен в виде строки. Если установленоFalse, значит останется какDecimalНапример, окончательное представление будет определяться визуализатором.

Если не установлено, по умолчанию используется то же, что иCOERCE_DECIMAL_TO_STRINGустановка того же значения, если не указано иноеTrue.


поля даты и времени

DateTimeField

Указывает дату и время.

соответствуетdjango.db.models.fields.DateTimeField.

подписать: DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)

  • format- Строка, представляющая выходной формат. Если не указано, по умолчанию используется то же, что иDATETIME_FORMATто же значение, что и у ключа настроек, если не установлено, оно будет'iso-8601'.设置为格式化字符串则表明to_representationВозвращаемое значение должно быть приведено к строковому выводу. Строка формата описана ниже. Установите это значение наNoneПредставляет Pythondatetimeобъект должен бытьto_representationвозвращение. В этом случае кодировка даты и времени будет определяться визуализатором.
  • input_formats- Список строк, представляющих форматы ввода, которые можно использовать для анализа даты. Если не указано, будет использоватьсяDATETIME_INPUT_FORMATSнастройка, которая по умолчанию['iso-8601'].

DateTimeFieldСтрока формата.

Строка формата может быть явно заданным форматом strftime Python или специальной строкой, использующей дату и время в стиле ISO 8601.iso-8601. (Например'2013-01-29T12:34:56.000000Z')

когдаNoneзначение используется для форматированияdatetimeобъект,to_representationбудет возвращено, а окончательное выходное представление будет определяться классом рендерера.

auto_nowиauto_now_addПоля модели.

использоватьModelSerializerилиHyperlinkedModelSerializer, обратите внимание, чтоauto_now=Trueилиauto_now_add=TrueПоля модели будут использоваться по умолчаниюread_only=True.

Если вы хотите переопределить это поведение, вам нужно явно объявить в классе сериализацииDateTimeField. Например:

class CommentSerializer(serializers.ModelSerializer):
    created = serializers.DateTimeField()

    class Meta:
        model = Comment

DateField

Указывает дату.

соответствуетdjango.db.models.fields.DateField

подписать: DateField(format=api_settings.DATE_FORMAT, input_formats=None)

  • format- Строка, представляющая выходной формат. Если не указано, по умолчанию используется то же, что иDATE_FORMATто же значение, что и у ключа настроек, если не установлено, оно будет'iso-8601'. Установите строку формата, чтобы указатьto_representationВозвращаемое значение должно быть приведено к строковому выводу. Строка формата описана ниже. Установите это значение наNoneПредставляет Pythondateобъект должен бытьto_representationвозвращение. В этом случае кодировка даты и времени будет определяться визуализатором.
  • input_formats- Список строк, представляющих форматы ввода, которые можно использовать для анализа даты. Если не указано, будет использоватьсяDATE_INPUT_FORMATSнастройка, которая по умолчанию['iso-8601'].

DateFieldстрока формата

Строка формата может быть явно заданным форматом Python strftime или специальной строкой, использующей дату в стиле ISO 8601.iso-8601. (Например'2013-01-29')

TimeField

Указывает время.

соответствуетdjango.db.models.fields.TimeField

подписать: TimeField(format=api_settings.TIME_FORMAT, input_formats=None)

  • format- Строка, представляющая выходной формат. Если не указано, по умолчанию используется то же, что иTIME_FORMATто же значение, что и у ключа настроек, если не установлено, оно будет'iso-8601'. Установите строку формата, чтобы указатьto_representationВозвращаемое значение должно быть приведено к строковому выводу. Строка формата описана ниже. Установите это значение наNoneПредставляет Pythontimeобъект должен бытьto_representationвозвращение. В этом случае кодировка даты и времени будет определяться визуализатором.
  • input_formats- Список строк, представляющих форматы ввода, которые можно использовать для анализа даты. Если не указано, будет использоватьсяTIME_INPUT_FORMATSнастройка, которая по умолчанию['iso-8601'].

TimeFieldстрока формата

Строка формата может быть явно заданным форматом Python strftime или специальной строкой, использующей время в стиле ISO 8601.iso-8601. (Например'12:34:56.000000')

DurationField

Указывает продолжительность. соответствуетdjango.db.models.fields.DurationField

из этих полейvalidated_dataБудет содержать одинdatetime.timedeltaпример. Представление следует формату'[DD] [HH:[MM:]]ss[.uuuuuu]'Нить.

подписать: DurationField()


выберите поле

ChoiceField

Поле, которое может принимать значения из ограниченного набора.

Если соответствующее поле модели содержитchoices=…параметры, тоModelSerializerПоля генерируются автоматически.

подписать: ChoiceField(choices)

  • choices- список допустимых значений, или(key, display_name)список кортежей.
  • allow_blank- если установленоTrue, пустая строка должна считаться допустимым значением. Если установленоFalse, то пустая строка считается недопустимой и возникает ошибка проверки. По умолчаниюFalse.
  • html_cutoff- Если установлено, это будет максимальное количество параметров, отображаемых в раскрывающемся списке выбора HTML. Может использоваться для обеспечения автоматического создания ChoiceField с очень большим выбором без блокировки рендеринга шаблона. По умолчаниюNone.
  • html_cutoff_text- Укажите текстовый индикатор для отображения, когда список усечен, например, в раскрывающемся списке выбора HTML, в котором усечено максимальное количество элементов. Он будет отображаться по умолчанию"More than {count} items…"

Allow_blankиallow_nullобаChoiceFieldЭффективный вариант, но настоятельно рекомендуется использовать только один вместо двух используемых. Для выбора текстаallow_blankСледует отдать предпочтение,allow_nullСледует отдавать предпочтение числам или другим нетекстовым параметрам.

MultipleChoiceField

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

подписать: MultipleChoiceField(choices)

  • choices- список допустимых значений, или(key, display_name)список кортежей.
  • allow_blank- если установленоTrue, пустая строка должна считаться допустимым значением. Если установленоFalse, то пустая строка считается недопустимой и возникает ошибка проверки. По умолчаниюFalse.
  • html_cutoff- Если установлено, это будет максимальное количество параметров, отображаемых в раскрывающемся списке выбора HTML. Может использоваться для обеспечения автоматического создания ChoiceField с очень большим выбором без блокировки рендеринга шаблона. По умолчаниюNone.
  • html_cutoff_text- Укажите текстовый индикатор для отображения, когда список усечен, например, в раскрывающемся списке выбора HTML, в котором усечено максимальное количество элементов. Он будет отображаться по умолчанию"More than {count} items…"

Allow_blankиallow_nullобаChoiceFieldДопустимые параметры для , но настоятельно рекомендуется использовать только один, а не оба. Для выделения текстаallow_blankдолжен быть первым выбором,allow_nullСледует отдавать предпочтение числам или другим нетекстовым параметрам.


поле загрузки файла

Парсинг и загрузка файлов.

FileFieldиImageFieldКласс работает только дляMultiPartParserилиFileUploadParser. Большинство парсеров, например JSON, не поддерживают загрузку файлов. Джанго генералFILE_UPLOAD_HANDLERSИспользуется для обработки загруженных файлов.

FileField

Представляет файл. Выполняет стандартную проверку FileField Django.

соответствуетdjango.forms.fields.FileField.

подписать: FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)

  • max_length- Укажите максимальную длину имени файла.
  • allow_empty_file- Указывает, разрешить ли пустой файл.
  • use_url- если установленоTrue, строковое значение URL будет использоваться для выходного представления. Если установленоFalse, строковое значение имени файла будет использоваться для выходного представления. По умолчаниюUPLOADED_FILES_USE_URLзначение ключа настроек, если не указано иноеTrue.

ImageField

Представляет собой изображение. Убедитесь, что содержимое загруженного файла соответствует известному формату изображения.

соответствуетdjango.forms.fields.ImageField.

подписать: ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)

  • max_length- Укажите максимальную длину имени файла.
  • allow_empty_file- Указывает, разрешать ли пустые файлы.
  • use_url- если установленоTrue, строковое значение URL будет использоваться для выходного представления. Если установленоFalse, строковое значение имени файла будет использоваться для выходного представления. По умолчаниюUPLOADED_FILES_USE_URLзначение ключа настроек, если не указано иноеTrue.

необходимостьPillowбиблиотека илиPILбиблиотека. Рекомендуется использоватьPillowбиблиотека. так какPILБольше не поддерживается.


составное поле

ListField

Класс поля для списка объектов проверки.

подписать: ListField(child=<A_FIELD_INSTANCE>, min_length=None, max_length=None)

  • child- Экземпляр поля, который следует использовать для проверки объектов в списке. Если этот параметр не указан, объекты в списке не будут проверены.
  • min_length- Убедитесь, что список содержит по крайней мере это количество элементов.
  • max_length- Убедитесь, что список содержит не более указанного количества элементов.

Например, чтобы проверить список целых чисел:

scores = serializers.ListField(
   child=serializers.IntegerField(min_value=0, max_value=100)
)

ListFieldКлассы также поддерживают декларативный стиль, который позволяет писать повторно используемые классы полей списка.

class StringListField(serializers.ListField):
    child = serializers.CharField()

Теперь мы можем повторно использовать наш обычай в нашем приложении.StringListFieldкласс, не предоставляя егоchildпараметр.

DictField

Проверьте класс поля словаря объектов.DictFieldКлючи всегда предполагаются строковыми значениями.

подписать: DictField(child=<A_FIELD_INSTANCE>)

  • child- Экземпляр поля, который следует использовать для проверки значений в словаре. Если этот параметр не указан, значения на карте не будут проверены.

Например, чтобы создать поле, которое проверяет соответствие между строками, вы можете написать:

document = DictField(child=CharField())

Вы также можете использовать какListFieldИспользуйте тот же декларативный стиль. Например:

class DocumentField(DictField):
    child = CharField()

JSONField

Класс поля, который проверяет, состоит ли входящая структура данных из допустимых примитивов JSON. В двоичном режиме он будет представлять и проверять двоичные строки в формате JSON.

подписать: JSONField(binary)

  • binary- если установленоTrue, поле будет выводить и проверять строку в кодировке JSON вместо необработанной структуры данных. По умолчаниюFalse.

другие типы полей

ReadOnlyField

Просто возвращает значение поля без изменения класса поля.

При включении имен полей, связанных со свойствами, вместо полей модели, это поле по умолчанию имеет значениеModelSerializerиспользовать вместе.

подписать: ReadOnlyField()

Например, еслиhas_expiredдаAccountсвойство в модели, следующий сериализатор автоматически сгенерирует его какReadOnlyField:

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ('id', 'account_name', 'has_expired')

HiddenField

Класс поля, который получает значение не на основе пользовательского ввода, а из значения по умолчанию или вызываемого объекта.

подписать: HiddenField()

Например, чтобы включить поле, которое всегда предоставляет текущее время, как часть данных проверки сериализованного класса, вы можете использовать следующее:

modified = serializers.HiddenField(default=timezone.now)

Если вам нужно выполнить некоторую проверку на основе некоторого предварительно заданного значения поля, вам обычно требуется толькоHiddenFieldclass вместо того, чтобы предоставлять все эти поля конечному пользователю.

ModelField

Общее поле, которое можно связать с любым полем модели.ModelFieldКласс делегирует задачу сериализации/десериализации связанным с ним полям модели. Это поле можно использовать для создания сериализованных полей для настраиваемых полей модели без создания новых настраиваемых сериализованных полей.

ModelSerializerИспользуйте это поле, чтобы соответствовать классу поля пользовательской модели.

подписать: ModelField(model_field=<Django ModelField instance>)

ModelFieldКлассы обычно используются внутри, но при необходимости могут использоваться API. для правильной реализацииModelField, вы должны передать поле, прикрепленное к созданной модели. Например:ModelField(model_field=MyModel()._meta.get_field('custom_field'))

SerializerMethodField

Это поле доступно только для чтения. Он получает свое значение, вызывая метод сериализованного класса, к которому он подключен. Его можно использовать для добавления любого типа данных в сериализованное представление объекта.

подписать: SerializerMethodField(method_name=None)

  • method_name- название метода для вызова сериализованного объекта. Если не включены, он по умолчаниюget_<field_name>.

Зависит отmethod_nameСериализованный метод, на который ссылается параметр, должен принимать один параметр (кромеself), который является объектом для сериализации. Он должен возвращать все, что вы хотите включить в сериализованное представление объекта. Например:

from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    days_since_joined = serializers.SerializerMethodField()

    class Meta:
        model = User

    def get_days_since_joined(self, obj):
        return (now() - obj.date_joined).days

произвольное поле

Если вы хотите создать настраиваемые поля, вам нужноFieldподкласс, затем переопределить.to_representation()и.to_internal_value()один или оба метода. Эти два метода используются для преобразования между исходным типом данных и базовым сериализованным типом данных. Основные типы данных обычно числовые, строковые, логические,date/time/datetimeилиNone. Они также могут быть любым списком или словарем, содержащим только другие объекты-примитивы. Другие типы могут поддерживаться в зависимости от используемого средства визуализации.

перечислить.to_representation()Метод преобразует исходный тип данных в базовый сериализуемый тип данных.

перечислитьto_internal_value()Метод восстанавливает примитивный тип данных в его внутреннее представление Python. Если данные недействительны, этот метод должен поднятьserializers.ValidationErrorаномальный.

Обратите внимание, что существует версия 2.x.WritableFieldКласс больше не существует. Таким образом, если поле должно поддерживать ввод данных, оно должно наследоватьFieldи перезаписатьto_internal_value().

посмотри на каштаны

Основные настраиваемые поля

Давайте посмотрим на пример сериализации класса, представляющего значения цвета RGB:

class Color(object):
    """
    A color represented in the RGB colorspace.
    """
    def __init__(self, red, green, blue):
        assert(red >= 0 and green >= 0 and blue >= 0)
        assert(red < 256 and green < 256 and blue < 256)
        self.red, self.green, self.blue = red, green, blue

class ColorField(serializers.Field):
    """
    Color objects are serialized into 'rgb(#, #, #)' notation.
    """
    def to_representation(self, obj):
        return "rgb(%d, %d, %d)" % (obj.red, obj.green, obj.blue)

    def to_internal_value(self, data):
        data = data.strip('rgb(').rstrip(')')
        red, green, blue = [int(col) for col in data.split(',')]
        return Color(red, green, blue)

По умолчанию значения полей рассматриваются как свойства, сопоставленные с объектами. Если вам нужно настроить способ доступа к значению поля, вам нужно переопределить.get_attribute()и/или.get_value().

Давайте создадим поле, которое можно использовать для представления имени класса сериализуемого объекта:

class ClassNameField(serializers.Field):
    def get_attribute(self, obj):
        # We pass the object instance onto `to_representation`,
        # not just the field attribute.
        return obj

    def to_representation(self, obj):
        """
        Serialize the object's class name.
        """
        return obj.__class__.__name__

выдать ошибку проверки

Наше вышеColorFieldВ настоящее время класс не выполняет никаких проверки данных. Представлять неверные данные, мы должны поднятьserializers.ValidationError,Следующее:

def to_internal_value(self, data):
    if not isinstance(data, six.text_type):
        msg = 'Incorrect type. Expected a string, but got %s'
        raise ValidationError(msg % type(data).__name__)

    if not re.match(r'^rgb\([0-9]+,[0-9]+,[0-9]+\)$', data):
        raise ValidationError('Incorrect format. Expected `rgb(#,#,#)`.')

    data = data.strip('rgb(').rstrip(')')
    red, green, blue = [int(col) for col in data.split(',')]

    if any([col > 255 or col < 0 for col in (red, green, blue)]):
        raise ValidationError('Value out of range. Must be between 0 and 255.')

    return Color(red, green, blue)

.fail()метод заключается в том, чтобы вызватьValidationErrorярлык, он начинается сerror_messagesПолученная строка сообщения в словаре. Например:

default_error_messages = {
    'incorrect_type': 'Incorrect type. Expected a string, but got {input_type}',
    'incorrect_format': 'Incorrect format. Expected `rgb(#,#,#)`.',
    'out_of_range': 'Value out of range. Must be between 0 and 255.'
}

def to_internal_value(self, data):
    if not isinstance(data, six.text_type):
        self.fail('incorrect_type', input_type=type(data).__name__)

    if not re.match(r'^rgb\([0-9]+,[0-9]+,[0-9]+\)$', data):
        self.fail('incorrect_format')

    data = data.strip('rgb(').rstrip(')')
    red, green, blue = [int(col) for col in data.split(',')]

    if any([col > 255 or col < 0 for col in (red, green, blue)]):
        self.fail('out_of_range')

    return Color(red, green, blue)

Этот стиль делает ваши сообщения об ошибках более четкими и отделяет их от кода, поэтому его следует предпочесть.

использоватьsource='*'

Здесь у нас будет лифтx_coordinateиy_coordinateплоскость собственностиDataPointПример модели.

class DataPoint(models.Model):
    label = models.CharField(max_length=50)
    x_coordinate = models.SmallIntegerField()
    y_coordinate = models.SmallIntegerField()

с помощью настраиваемых полей иsource ='*', мы можем обеспечить вложенное представление пар координат:

class CoordinateField(serializers.Field):

    def to_representation(self, obj):
        ret = {
            "x": obj.x_coordinate,
            "y": obj.y_coordinate
        }
        return ret

    def to_internal_value(self, data):
        ret = {
            "x_coordinate": data["x"],
            "y_coordinate": data["y"],
        }
        return ret


class DataPointSerializer(serializers.ModelSerializer):
    coordinates = CoordinateField(source='*')

    class Meta:
        model = DataPoint
        fields = ['label', 'coordinates']

Обратите внимание, что этот пример не обрабатывает проверку. использоватьsource ='*'Вложенный класс сериализации обрабатывает координат гнездо лучше и поставляется с двумяIntegerFieldэкземпляры, каждый со своимsourceУкажите на соответствующее поле.

Однако ключевыми моментами этого примера являются:

  • to_representationпройти весьDataPointобъект и будет отображаться на желаемый результат.
>>> instance = DataPoint(label='Example', x_coordinate=1, y_coordinate=2)
>>> out_serializer = DataPointSerializer(instance)
>>> out_serializer.data
ReturnDict([('label', 'Example'), ('coordinates', {'x': 1, 'y': 2})])
  • Если только наше поле не доступно только для чтения, в противном случаеto_internal_valueДолжен сопоставляться со словарем, подходящим для обновления целевого объекта. использоватьsource='*',to_internal_valueВозврат обновит проверенный корнем словарь данных, а не один ключ.
>>> data = {
...     "label": "Second Example",
...     "coordinates": {
...         "x": 3,
...         "y": 4,
...     }
... }
>>> in_serializer = DataPointSerializer(data=data)
>>> in_serializer.is_valid()
True
>>> in_serializer.validated_data
OrderedDict([('label', 'Second Example'),
             ('y_coordinate', 4),
             ('x_coordinate', 3)])

Для полноты картины делаем то же самое еще раз, но с предложенным выше методом вложенной сериализации:

class NestedCoordinateSerializer(serializers.Serializer):
    x = serializers.IntegerField(source='x_coordinate')
    y = serializers.IntegerField(source='y_coordinate')


class DataPointSerializer(serializers.ModelSerializer):
    coordinates = NestedCoordinateSerializer(source='*')

    class Meta:
        model = DataPoint
        fields = ['label', 'coordinates']

Мы здесьIntegerFieldЦелевые и исходные атрибуты обработки операторов (xиx_coordinate,yиy_coordinate) отображение между. Это используетсяsource ='*'изNestedCoordinateSerializer.

новыйDataPointSerializerДемонстрирует то же поведение, что и методы настраиваемого поля.

Сериализация:

>>> out_serializer = DataPointSerializer(instance)
>>> out_serializer.data
ReturnDict([('label', 'testing'),
            ('coordinates', OrderedDict([('x', 1), ('y', 2)]))])

Десериализовать:

>>> in_serializer = DataPointSerializer(data=data)
>>> in_serializer.is_valid()
True
>>> in_serializer.validated_data
OrderedDict([('label', 'still testing'),
             ('x_coordinate', 3),
             ('y_coordinate', 4)])

Хотя валидация не написана, можно использовать встроенные валидации:

>>> invalid_data = {
...     "label": "still testing",
...     "coordinates": {
...         "x": 'a',
...         "y": 'b',
...     }
... }
>>> invalid_serializer = DataPointSerializer(data=invalid_data)
>>> invalid_serializer.is_valid()
False
>>> invalid_serializer.errors
ReturnDict([('coordinates',
             {'x': ['A valid integer is required.'],
              'y': ['A valid integer is required.']})])

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