Официальная оригинальная ссылка
Эта серия статей адрес 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)
Если вам нужно выполнить некоторую проверку на основе некоторого предварительно заданного значения поля, вам обычно требуется толькоHiddenField
class вместо того, чтобы предоставлять все эти поля конечному пользователю.
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.']})])
По этой причине сначала можно попробовать вложенные методы класса сериализации. Подход с настраиваемым полем можно использовать, когда вложение сериализованных классов становится непрактичным или слишком сложным.