Справочник по полям модели
В этом документе содержатся все справочные материалы API для Field, включая параметры полей и типы полей, доступные в Django.
См. также
Если встроенные поля не подходят, попробуйте django-localflavor (документация), содержащий различные фрагменты кода, полезные для отдельных стран и культур.
Кроме того, вы можете легко написать собственные пользовательские поля модели.
Примечание
Поля определены в django.db.models.fields, но для удобства импортируются в django.db.models. Обычно используют from django.db import models и обращаются к полям как к models.<Foo>Field.
Параметры полей
Следующие аргументы доступны для всех типов полей. Все они необязательны.
null
-
Field.null
Если True, Django будет сохранять пустые значения в базе данных как NULL. По умолчанию — False.
Избегайте использования null для строковых полей, таких как CharField и TextField. Согласно принятому в Django соглашению, для обозначения состояния «нет данных» в строковых полях используется пустая строка, а не NULL. Если для строкового поля задано null=False, для состояния «нет данных» по-прежнему можно сохранять пустые строки. Если для строкового поля задано null=True, это означает, что у состояния «нет данных» есть два возможных значения: NULL и пустая строка. В большинстве случаев наличие двух возможных значений для состояния «нет данных» избыточно. Исключение — когда для CharField заданы и unique=True, и blank=True. В этом случае null=True необходимо, чтобы избежать нарушения ограничений уникальности при сохранении нескольких объектов с пустыми значениями.
Как для строковых, так и для нестроковых полей, если вы хотите разрешить пустые значения в формах, также необходимо задать blank=True, поскольку параметр null влияет только на хранение данных в базе данных (см. blank).
Примечание
При использовании серверной части базы данных Oracle значение NULL будет сохраняться как обозначение пустой строки независимо от этого атрибута.
blank
-
Field.blank
Если задано True, поле может быть пустым. По умолчанию — False.
Обратите внимание, что это не то же самое, что null. null относится исключительно к базе данных, тогда как blank относится к проверке данных. Если для поля задано blank=True, проверка формы разрешит ввод пустого значения. Если для поля задано blank=False, поле будет обязательным.
choices
-
Field.choices[исходный код]
Словарь или итерируемый объект в описанном ниже формате, используемый в качестве вариантов выбора для этого поля. Если варианты выбора заданы, они проверяются при проверке модели, а стандартный виджет формы будет представлен полем со списком этих вариантов вместо обычного текстового поля.
Если передан словарь, ключевой элемент — это фактическое значение, которое будет присвоено модели, а второй элемент — понятное пользователю название. Например:
YEAR_IN_SCHOOL_CHOICES = {
"FR": "Freshman",
"SO": "Sophomore",
"JR": "Junior",
"SR": "Senior",
"GR": "Graduate",
}
Также можно передать последовательность, состоящую из итерируемых объектов ровно с двумя элементами (например, [(A1, B1), (A2, B2), …]). Первый элемент каждого кортежа — это фактическое значение, которое будет присвоено модели, а второй — понятное пользователю название. Например:
YEAR_IN_SCHOOL_CHOICES = [
("FR", "Freshman"),
("SO", "Sophomore"),
("JR", "Junior"),
("SR", "Senior"),
("GR", "Graduate"),
]
choices также можно задать как вызываемый объект, который не принимает аргументов и возвращает любой из описанных выше форматов. Например:
def get_currencies():
return {i: i for i in settings.CURRENCIES}
class Expense(models.Model):
amount = models.DecimalField(max_digits=10, decimal_places=2)
currency = models.CharField(max_length=3, choices=get_currencies)
Передача вызываемого объекта для choices может быть особенно удобна, например, когда варианты выбора:
- являются результатом операций с интенсивным вводом-выводом (которые потенциально можно кэшировать), например запроса таблицы в той же или внешней базе данных либо получения вариантов выбора из статического файла;
- представляют собой список, который в основном остаётся неизменным, но может время от времени меняться или различаться в разных проектах. Примеры этой категории — сторонние приложения, предоставляющие общепринятый набор значений, таких как валюты, страны, языки, часовые пояса и т. д.
Как правило, лучше всего определять варианты выбора внутри класса модели и задавать константу с подходящим именем для каждого значения:
from django.db import models
class Student(models.Model):
FRESHMAN = "FR"
SOPHOMORE = "SO"
JUNIOR = "JR"
SENIOR = "SR"
GRADUATE = "GR"
YEAR_IN_SCHOOL_CHOICES = {
FRESHMAN: "Freshman",
SOPHOMORE: "Sophomore",
JUNIOR: "Junior",
SENIOR: "Senior",
GRADUATE: "Graduate",
}
year_in_school = models.CharField(
max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default=FRESHMAN,
)
def is_upperclass(self):
return self.year_in_school in {self.JUNIOR, self.SENIOR}
Хотя можно определить список вариантов выбора вне класса модели и затем ссылаться на него, определение вариантов выбора и названий каждого из них внутри класса модели позволяет хранить всю эту информацию в классе, который её использует, и упрощает обращение к вариантам выбора (например, Student.SOPHOMORE будет работать в любом месте, где импортирована модель Student).
Также можно объединить доступные варианты выбора в именованные группы для удобства организации:
MEDIA_CHOICES = {
"Audio": {
"vinyl": "Vinyl",
"cd": "CD",
},
"Video": {
"vhs": "VHS Tape",
"dvd": "DVD",
},
"unknown": "Unknown",
}
Ключ словаря — это название группы, а значение — варианты выбора в этой группе, состоящие из значения поля и понятного пользователю названия варианта. Сгруппированные варианты можно объединять с несгруппированными в одном словаре (например, вариант "unknown" в этом примере).
Можно также использовать последовательность, например список из 2-кортежей:
MEDIA_CHOICES = [
(
"Audio",
(
("vinyl", "Vinyl"),
("cd", "CD"),
),
),
(
"Video",
(
("vhs", "VHS Tape"),
("dvd", "DVD"),
),
),
("unknown", "Unknown"),
]
Обратите внимание, что варианты выбора могут быть любым объектом-последовательностью — не обязательно списком или кортежем. Это позволяет динамически формировать варианты выбора. Однако если вам приходится прибегать к хитростям, чтобы сделать choices динамическим, вероятно, лучше использовать подходящую таблицу базы данных с ForeignKey. choices предназначен для статических данных, которые меняются редко или не меняются вовсе.
Примечание
При каждом изменении порядка choices создаётся новая миграция.
Для каждого поля модели, у которого задано choices, Django преобразует варианты выбора в список 2-кортежей и добавляет метод для получения понятного пользователю названия текущего значения поля. См. get_FOO_display() в документации по API базы данных.
Если для поля не задано blank=False и при этом задано default, рядом со списком выбора будет отображаться метка со значением "---------". Чтобы изменить это поведение, добавьте в choices кортеж, содержащий None; например, (None, 'Your String For Display'). В качестве альтернативы можно использовать пустую строку вместо None, если это уместно, например для CharField.
Типы перечислений
Кроме того, Django предоставляет типы перечислений, которые можно наследовать для краткого определения вариантов выбора:
from django.utils.translation import gettext_lazy as _
class Student(models.Model):
class YearInSchool(models.TextChoices):
FRESHMAN = "FR", _("Freshman")
SOPHOMORE = "SO", _("Sophomore")
JUNIOR = "JR", _("Junior")
SENIOR = "SR", _("Senior")
GRADUATE = "GR", _("Graduate")
year_in_school = models.CharField(
max_length=2,
choices=YearInSchool,
default=YearInSchool.FRESHMAN,
)
def is_upperclass(self):
return self.year_in_school in {
self.YearInSchool.JUNIOR,
self.YearInSchool.SENIOR,
}
Они похожи на enum из стандартной библиотеки Python, но с некоторыми изменениями:
- Значения элементов перечисления — это кортеж аргументов, используемых при создании конкретного типа данных. Django поддерживает добавление в конец этого кортежа дополнительной строковой величины, которая будет использоваться как понятное пользователю название, или
label.labelможет быть ленивой переводимой строкой. Поэтому в большинстве случаев значение элемента представляет собой(value, label)2-кортеж. Ниже приведён пример наследования от choices с использованием более сложного типа данных. Если кортеж не указан или последний элемент не является (ленивой) строкой,labelгенерируется автоматически на основе имени элемента. - К значениям добавляется свойство
.label, возвращающее понятное пользователю название. -
К классам перечислений добавляется ряд пользовательских свойств —
.choices,.labels,.valuesи.names, — которые упрощают доступ к спискам отдельных частей перечисления.Предупреждение
Эти имена свойств нельзя использовать в качестве имён элементов, так как это приведёт к конфликту.
- Применяется
enum.unique(), чтобы гарантировать, что значения не будут определены несколько раз. Для вариантов выбора поля такое поведение вряд ли будет ожидаемым.
Обратите внимание: использование YearInSchool.SENIOR, YearInSchool['SENIOR'] или YearInSchool('SR') для доступа к элементам перечисления или поиска по ним работает как ожидается. Это также относится к свойствам .name и .value элементов.
Если переводить понятные пользователю названия не требуется, их можно сформировать на основе имени элемента (заменив подчёркивания пробелами и используя регистр заголовка):
>>> class Vehicle(models.TextChoices): ... CAR = "C" ... TRUCK = "T" ... JET_SKI = "J" ... >>> Vehicle.JET_SKI.label 'Jet Ski'
Поскольку необходимость в целочисленных значениях элементов перечисления встречается очень часто, Django предоставляет класс IntegerChoices. Например:
class Card(models.Model):
class Suit(models.IntegerChoices):
DIAMOND = 1
SPADE = 2
HEART = 3
CLUB = 4
suit = models.IntegerField(choices=Suit)
Также можно использовать функциональный API Enum, учитывая, что метки генерируются автоматически, как описано выше:
>>> MedalType = models.TextChoices("MedalType", "GOLD SILVER BRONZE")
>>> MedalType.choices
[('GOLD', 'Gold'), ('SILVER', 'Silver'), ('BRONZE', 'Bronze')]
>>> Place = models.IntegerChoices("Place", "FIRST SECOND THIRD")
>>> Place.choices
[(1, 'First'), (2, 'Second'), (3, 'Third')]
Если вам нужна поддержка конкретного типа данных, отличного от int или str, можно создать подкласс Choices и необходимого конкретного типа данных, например date для использования с DateField:
class MoonLandings(datetime.date, models.Choices):
APOLLO_11 = 1969, 7, 20, "Apollo 11 (Eagle)"
APOLLO_12 = 1969, 11, 19, "Apollo 12 (Intrepid)"
APOLLO_14 = 1971, 2, 5, "Apollo 14 (Antares)"
APOLLO_15 = 1971, 7, 30, "Apollo 15 (Falcon)"
APOLLO_16 = 1972, 4, 21, "Apollo 16 (Orion)"
APOLLO_17 = 1972, 12, 11, "Apollo 17 (Challenger)"
Следует учитывать ещё несколько особенностей:
- Типы перечислений не поддерживают именованные группы.
-
Поскольку перечисление с конкретным типом данных требует, чтобы все значения соответствовали этому типу, переопределить пустую метку нельзя, создав элемент со значением
None. Вместо этого задайте атрибут__empty__класса:class Answer(models.IntegerChoices): NO = 0, _("No") YES = 1, _("Yes") __empty__ = _("(Unknown)")
db_column
-
Field.db_column
Имя столбца базы данных, используемого для этого поля. Если оно не задано, Django использует имя поля.
Если имя столбца базы данных является зарезервированным словом SQL или содержит символы, недопустимые в именах переменных Python, в частности дефис, это не проблема. Django автоматически заключает имена столбцов и таблиц в кавычки.
db_comment
-
Field.db_comment
Комментарий к столбцу базы данных, используемому для этого поля. Он полезен для документирования полей для тех, у кого есть непосредственный доступ к базе данных и кто может не просматривать ваш код Django. Например:
pub_date = models.DateTimeField(
db_comment="Date and time when the article was published",
)
db_default
-
Field.db_default
Значение по умолчанию для этого поля, вычисляемое базой данных. Это может быть литеральное значение или функция базы данных, например Now:
created = models.DateTimeField(db_default=Now())
Можно использовать более сложные выражения, если они составлены из литеральных значений и функций базы данных:
month_due = models.DateField(
db_default=TruncMonth(
Now() + timedelta(days=90),
output_field=models.DateField(),
)
)
Значения по умолчанию в базе данных не могут ссылаться на другие поля или модели. Например, следующий код недопустим:
end = models.IntegerField(db_default=F("start") + 50)
Если заданы и db_default, и Field.default, при создании экземпляров в коде Python приоритет будет у default. db_default всё равно будет задано на уровне базы данных и будет использоваться при вставке строк в обход ORM или при добавлении нового поля в миграции.
Если для поля задано db_default, но не задано default и полю не присвоено значение, для этого поля в несохранённых экземплярах модели будет возвращаться объект DatabaseDefault. Фактическое значение поля определяется базой данных при сохранении экземпляра модели.
db_index
-
Field.db_index
Если задано True, для этого поля будет создан индекс базы данных.
db_tablespace
-
Field.db_tablespace[исходный код]
Имя табличного пространства базы данных, используемого для индекса этого поля, если поле индексируется. По умолчанию используется параметр DEFAULT_INDEX_TABLESPACE проекта, если он задан, или db_tablespace модели, если оно задано. Если серверная часть не поддерживает табличные пространства для индексов, этот параметр игнорируется.
default
-
Field.default
Значение поля по умолчанию. Это может быть значение или вызываемый объект. Если это вызываемый объект, он будет вызываться при каждом создании нового объекта.
Значение по умолчанию не может быть изменяемым объектом (экземпляром модели, list, set и т. д.), так как в качестве значения по умолчанию для всех новых экземпляров модели будет использоваться ссылка на один и тот же экземпляр этого объекта. Вместо этого оберните нужное значение по умолчанию в вызываемый объект. Например, если для JSONField нужно указать значение dict по умолчанию, используйте функцию:
def contact_default():
return {"email": "to1@example.com"}
contact_info = JSONField("ContactInfo", default=contact_default)
lambda нельзя использовать для таких параметров полей, как default, поскольку их невозможно сериализовать в миграциях. Другие ограничения описаны в соответствующей документации.
Для полей, таких как ForeignKey, которые указывают на экземпляры модели, значениями по умолчанию должны быть значения поля, на которое они ссылаются (pk, если не задано to_field), а не экземпляры модели.
Значение по умолчанию используется при создании новых экземпляров модели, если для поля не указано значение. Для поля первичного ключа значение по умолчанию также используется, если полю присвоено None.
Значение по умолчанию можно также задать на уровне базы данных с помощью Field.db_default.
editable
-
Field.editable
Если задано False, поле не будет отображаться в административном интерфейсе или любой другой ModelForm. Оно также будет пропускаться при проверке модели. По умолчанию — True.
error_messages
-
Field.error_messages[исходный код]
Аргумент error_messages позволяет переопределить сообщения по умолчанию, которые вызывает поле. Передайте словарь с ключами, соответствующими сообщениям об ошибках, которые нужно переопределить.
Ключи сообщений об ошибках включают null, blank, invalid, invalid_choice, unique и unique_for_date. Дополнительные ключи сообщений об ошибках для каждого поля указаны ниже в разделе Типы полей.
Эти сообщения об ошибках часто не передаются формам. См. Рекомендации по использованию error_messages модели.
help_text
-
Field.help_text
Дополнительный текст «справки», отображаемый вместе с виджетом формы. Он полезен для документирования, даже если поле не используется в форме.
Обратите внимание, что это значение не экранируется как HTML в автоматически создаваемых формах. Поэтому при желании в help_text можно включить HTML. Например:
help_text = "Please use the following format: <em>YYYY-MM-DD</em>."
В качестве альтернативы можно использовать обычный текст и django.utils.html.escape() для экранирования специальных символов HTML. Чтобы избежать атаки межсайтового скриптинга, не забывайте экранировать справочный текст, который может поступать от недоверенных пользователей.
primary_key
-
Field.primary_key
Если задано True, это поле является первичным ключом модели.
Если в модели ни для одного поля не указано primary_key=True и составной первичный ключ не определён, Django автоматически добавит поле для хранения первичного ключа. Поэтому не нужно задавать primary_key=True ни для одного из полей, если только вы не хотите переопределить поведение первичного ключа по умолчанию. Тип автоматически создаваемых полей первичного ключа можно указать для каждого приложения в AppConfig.default_auto_field или глобально в параметре DEFAULT_AUTO_FIELD. Подробнее см. Автоматические поля первичного ключа.
primary_key=True подразумевает null=False и unique=True. Для одной модели только у одного поля может быть задано primary_key=True. Составные первичные ключи необходимо определять с помощью CompositePrimaryKey, а не устанавливать этот флаг в True для всех полей, чтобы сохранить этот инвариант.
Поле первичного ключа доступно только для чтения. Если изменить значение первичного ключа существующего объекта и сохранить его, будет создан новый объект, а старый останется без изменений.
Значение поля первичного ключа устанавливается в None при удалении объекта с помощью deleting.
Добавлено поле CompositePrimaryKey.
unique
-
Field.unique[исходный код]
Если задано True, это поле должно быть уникальным во всей таблице.
Уникальность обеспечивается на уровне базы данных и при проверке модели. Если попытаться сохранить модель с дублирующимся значением в поле unique, метод save() модели вызовет исключение django.db.IntegrityError.
Этот параметр допустим для всех типов полей, кроме ManyToManyField и OneToOneField.
Обратите внимание: если для unique задано True, указывать db_index не нужно, так как unique подразумевает создание индекса.
unique_for_date
-
Field.unique_for_date
Укажите здесь имя DateField или DateTimeField, чтобы потребовать уникальности этого поля для значения поля даты.
Например, если у вас есть поле title, для которого задано unique_for_date="pub_date", Django не позволит создать две записи с одинаковыми значениями title и pub_date.
Обратите внимание: если указать здесь DateTimeField, будет учитываться только дата, без времени. Кроме того, если USE_TZ задано в True, проверка будет выполняться в текущем часовом поясе на момент сохранения объекта.
Это ограничение проверяется методом Model.validate_unique() при проверке модели, но не на уровне базы данных. Если какое-либо ограничение unique_for_date включает поля, не входящие в ModelForm (например, если одно из полей указано в exclude или для него задано editable=False), метод Model.validate_unique() пропустит проверку этого ограничения.
unique_for_month
-
Field.unique_for_month
Аналогично unique_for_date, но требует уникальности поля относительно месяца.
unique_for_year
-
Field.unique_for_year
Аналогично unique_for_date и unique_for_month.
verbose_name
-
Field.verbose_name
Понятное пользователю имя поля. Если подробное имя не задано, Django автоматически создаст его на основе имени атрибута поля, заменив подчёркивания пробелами. См. Подробные имена полей.
validators
-
Field.validators[исходный код]
Список валидаторов, запускаемых для этого поля. Подробнее см. в документации по валидаторам.
Типы полей
AutoField
-
class AutoField(**options)[исходный код]
IntegerField, который автоматически увеличивается в соответствии с доступными идентификаторами. Обычно вам не потребуется использовать его напрямую: поле первичного ключа автоматически добавляется в модель, если не указать иное. См. раздел Автоматические поля первичного ключа.
BigAutoField
-
class BigAutoField(**options)[исходный код]
64-разрядное целое число, похожее на AutoField, но гарантированно вмещающее числа от 1 до 9223372036854775807.
BigIntegerField
-
class BigIntegerField(**options)[исходный код]
64-разрядное целое число, похожее на IntegerField, но гарантированно вмещающее числа от -9223372036854775808 до 9223372036854775807. Виджет формы по умолчанию для этого поля — NumberInput.
BinaryField
-
class BinaryField(max_length=None, **options)[исходный код]
Поле для хранения необработанных двоичных данных. Ему можно присвоить bytes, bytearray или memoryview.
По умолчанию BinaryField устанавливает для editable значение False, и в этом случае поле нельзя включить в ModelForm.
-
BinaryField.max_length -
Необязательный параметр. Максимальная длина поля (в байтах). Максимальная длина проверяется средствами валидации Django с помощью
MaxLengthValidator.
Неправильное использование BinaryField
Возможно, вы подумаете о хранении файлов в базе данных, однако в 99% случаев это плохое решение. Это поле не является заменой правильной обработки статических файлов.
BooleanField
-
class BooleanField(**options)[исходный код]
Поле со значением «истина» или «ложь».
Виджет формы по умолчанию для этого поля — CheckboxInput или NullBooleanSelect, если задано null=True.
Значение по умолчанию для BooleanField — None, если не задано Field.default.
CompositePrimaryKey
-
class CompositePrimaryKey(*field_names, **options)[исходный код]
Виртуальное поле для определения составного первичного ключа.
Это поле необходимо определить как атрибут pk модели. Если оно задано, Django создаст базовую таблицу модели с составным первичным ключом.
Аргумент *field_names — это список позиционных имён полей, составляющих первичный ключ.
Подробнее см. раздел Составные первичные ключи.
CharField
-
class CharField(max_length=None, **options)[исходный код]
Строковое поле для строк от небольшого до большого размера.
Для больших объёмов текста используйте TextField.
Виджет формы по умолчанию для этого поля — TextInput.
У CharField есть следующие дополнительные аргументы:
-
CharField.max_length -
Максимальная длина поля (в символах). Значение
max_lengthпроверяется на уровне базы данных и средствами валидации Django с помощьюMaxLengthValidator. Оно обязательно для всех бэкендов баз данных, включённых в Django, кроме PostgreSQL и SQLite, которые поддерживают столбцыVARCHARнеограниченной длины.Примечание
Если вы разрабатываете приложение, которое должно работать с несколькими бэкендами баз данных, учитывайте, что некоторые бэкенды накладывают ограничения на
max_length. Подробнее см. в разделе Примечания по бэкендам баз данных.Изменено в Django 5.2:В SQLite добавлена поддержка столбцов
VARCHARнеограниченной длины.
-
CharField.db_collation -
Необязательный параметр. Имя параметра сортировки поля в базе данных.
Примечание
Имена параметров сортировки не стандартизированы. Поэтому этот параметр не будет переносимым между разными бэкендами баз данных.
Oracle
Oracle поддерживает параметры сортировки, только если параметру инициализации базы данных
MAX_STRING_SIZEприсвоено значениеEXTENDED.
DateField
-
class DateField(auto_now=False, auto_now_add=False, **options)[исходный код]
Дата, представленная в Python экземпляром datetime.date. Имеет несколько дополнительных необязательных аргументов:
-
DateField.auto_now -
Автоматически устанавливает текущую дату каждый раз, когда сохраняется объект. Полезно для отметок времени «последнего изменения». Обратите внимание, что всегда используется текущая дата; это не просто значение по умолчанию, которое можно переопределить.
Поле автоматически обновляется только при вызове
Model.save(). Оно не обновляется при изменении других полей другими способами, например с помощьюQuerySet.update(), хотя при таком обновлении можно указать для поля собственное значение.
-
DateField.auto_now_add -
Автоматически устанавливает текущую дату при первом создании объекта. Полезно для создания отметок времени. Обратите внимание, что всегда используется текущая дата; это не просто значение по умолчанию, которое можно переопределить. Поэтому даже если при создании объекта задать значение для этого поля, оно будет проигнорировано. Если вы хотите иметь возможность изменять это поле, вместо
auto_now_add=Trueзадайте следующее:- Для
DateField:default=date.today— изdatetime.date.today() - Для
DateTimeField:default=timezone.now— изdjango.utils.timezone.now()
- Для
Виджет формы по умолчанию для этого поля — DateInput. В административном интерфейсе добавляются календарь на JavaScript и кнопка быстрого выбора «Сегодня». Также включён дополнительный ключ сообщения об ошибке invalid_date.
Параметры auto_now_add, auto_now и default взаимоисключающие. Любое сочетание этих параметров приведёт к ошибке.
Примечание
В текущей реализации установка auto_now или auto_now_add в значение True приведёт к тому, что для поля будут установлены editable=False и blank=True.
Примечание
Параметры auto_now и auto_now_add всегда используют дату в часовом поясе по умолчанию на момент создания или обновления. Если вам нужно другое поведение, можно задать собственное вызываемое значение по умолчанию или переопределить save() вместо использования auto_now или auto_now_add; либо использовать DateTimeField вместо DateField и самостоятельно определить обработку преобразования даты и времени в дату при отображении.
Предупреждение
Всегда используйте DateField с экземпляром datetime.date.
Если у вас есть экземпляр datetime.datetime, рекомендуется сначала преобразовать его в datetime.date. В противном случае DateField применит к datetime.datetime часовой пояс по умолчанию из раздела часовой пояс по умолчанию и преобразует его в экземпляр datetime.date, удалив компонент времени. Это относится как к хранению, так и к сравнению.
DateTimeField
-
class DateTimeField(auto_now=False, auto_now_add=False, **options)[исходный код]
Дата и время, представленные в Python экземпляром datetime.datetime. Принимает те же дополнительные аргументы, что и DateField.
Виджет формы по умолчанию для этого поля — единый DateTimeInput. В административном интерфейсе используются два отдельных виджета TextInput с быстрыми действиями на JavaScript.
Предупреждение
Всегда используйте DateTimeField с экземпляром datetime.datetime.
Если у вас есть экземпляр datetime.date, рекомендуется сначала преобразовать его в datetime.datetime. В противном случае DateTimeField будет использовать полночь в часовом поясе по умолчанию в качестве компонента времени. Это относится как к хранению, так и к сравнению. Чтобы сравнить часть даты у DateTimeField с экземпляром datetime.date, используйте поиск date.
DecimalField
-
class DecimalField(max_digits=None, decimal_places=None, **options)[исходный код]
Десятичное число с фиксированной точностью, представленное в Python экземпляром Decimal. Проверка введённых данных выполняется с помощью DecimalValidator.
Имеет следующие обязательные аргументы:
-
DecimalField.max_digits -
Максимальное количество цифр, допустимое в числе. Это значение должно быть больше или равно
decimal_places.
-
DecimalField.decimal_places -
Количество десятичных знаков, сохраняемых в числе.
Например, чтобы хранить числа до 999.99 с точностью до 2 десятичных знаков, используйте:
models.DecimalField(..., max_digits=5, decimal_places=2)
А чтобы хранить числа примерно до миллиарда с точностью до 10 десятичных знаков:
models.DecimalField(..., max_digits=19, decimal_places=10)
Виджетом формы по умолчанию для этого поля является NumberInput, если localize имеет значение False, и TextInput в противном случае.
Примечание
Подробнее о различиях между классами FloatField и DecimalField см. в разделе FloatField и DecimalField. Также учитывайте ограничения SQLite для десятичных полей.
DurationField
-
class DurationField(**options)[исходный код]
Поле для хранения промежутков времени, представляемых в Python типом timedelta. В PostgreSQL используется тип данных interval, а в Oracle — INTERVAL DAY(9) TO
SECOND(6). В остальных случаях используется bigint микросекунд.
Примечание
Арифметические операции с DurationField работают в большинстве случаев. Однако во всех базах данных, кроме PostgreSQL, сравнение значения DurationField с результатом арифметических операций над экземплярами DateTimeField работает не так, как ожидается.
EmailField
-
class EmailField(max_length=254, **options)[исходный код]
CharField, которое проверяет корректность адреса электронной почты с помощью EmailValidator.
FileField
-
class FileField(upload_to='', storage=None, max_length=100, **options)[исходный код]
Поле для загрузки файлов.
Примечание
Аргумент primary_key не поддерживается, и его использование приведет к ошибке.
Поддерживаются следующие необязательные аргументы:
-
FileField.upload_to -
Этот атрибут позволяет задать каталог загрузки и имя файла; задать их можно двумя способами. В обоих случаях значение передается методу
Storage.save().Если указать строковое значение или объект
Path, оно может содержать форматированиеstrftime(), которое будет заменено датой и временем загрузки файла (чтобы загружаемые файлы не заполняли один и тот же каталог). Например:class MyModel(models.Model): # file will be uploaded to MEDIA_ROOT/uploads upload = models.FileField(upload_to="uploads/") # or... # file will be saved to MEDIA_ROOT/uploads/2015/01/30 upload = models.FileField(upload_to="uploads/%Y/%m/%d/")Если используется хранилище по умолчанию
FileSystemStorage, строковое значение будет добавлено к путиMEDIA_ROOT, чтобы сформировать расположение файлов на локальной файловой системе. Если используется другое хранилище, обратитесь к его документации, чтобы узнать, как оно обрабатываетupload_to.Значение
upload_toтакже может быть вызываемым объектом, например функцией. Она будет вызвана для получения пути загрузки, включая имя файла. Этот вызываемый объект должен принимать два аргумента и возвращать путь в стиле Unix (с прямыми косыми чертами), который будет передан системе хранения. Это два аргумента:Аргумент
Описание
instanceЭкземпляр модели, в которой определено поле
FileField. Точнее, это конкретный экземпляр, к которому прикрепляется текущий файл.В большинстве случаев этот объект еще не сохранен в базе данных, поэтому при использовании стандартного
AutoFieldзначение его поля первичного ключа может быть еще не задано.filenameИмя, первоначально заданное файлу. Оно может учитываться или не учитываться при определении конечного пути назначения.
Например:
def user_directory_path(instance, filename): # file will be uploaded to MEDIA_ROOT/user_<id>/<filename> return "user_{0}/{1}".format(instance.user.id, filename) class MyModel(models.Model): upload = models.FileField(upload_to=user_directory_path)
-
FileField.storage -
Объект хранилища или вызываемый объект, возвращающий объект хранилища. Он отвечает за хранение и получение файлов. Подробности о том, как предоставить этот объект, см. в разделе Управление файлами.
Для этого поля по умолчанию используется виджет формы ClearableFileInput.
Чтобы использовать в модели FileField или ImageField (см. ниже), выполните несколько шагов:
- В файле настроек задайте
MEDIA_ROOTкак полный путь к каталогу, в котором Django будет хранить загруженные файлы. (Для повышения производительности эти файлы не хранятся в базе данных.) ЗадайтеMEDIA_URLкак базовый общедоступный URL этого каталога. Убедитесь, что у учетной записи пользователя веб-сервера есть разрешение на запись в этот каталог. - Добавьте в модель
FileFieldилиImageField, задав параметрupload_to, чтобы указать подкаталогMEDIA_ROOTдля загружаемых файлов. - В базе данных будет храниться только путь к файлу (относительно
MEDIA_ROOT). Скорее всего, вам пригодится предоставляемый Django атрибутurl. Например, если ваше полеImageFieldназываетсяmug_shot, в шаблоне можно получить абсолютный путь к изображению с помощью{{ object.mug_shot.url }}.
Предположим, что для MEDIA_ROOT задано значение '/home/media', а для upload_to — 'photos/%Y/%m/%d'. Часть '%Y/%m/%d' значения upload_to использует форматирование strftime(); '%Y' — это год из четырех цифр, '%m' — месяц из двух цифр, а '%d' — день из двух цифр. Если загрузить файл 15 января 2007 года, он будет сохранен в каталоге /home/media/photos/2007/01/15.
Чтобы получить имя загруженного файла на диске или его размер, можно использовать атрибуты name и size соответственно. Дополнительные сведения о доступных атрибутах и методах см. в справочнике по классу File и в тематическом руководстве Управление файлами.
Примечание
Файл сохраняется при сохранении модели в базе данных, поэтому фактическое имя файла на диске нельзя считать окончательным до сохранения модели.
Относительный URL загруженного файла можно получить с помощью атрибута url. Внутри он вызывает метод url() базового класса Storage.
Обратите внимание: при работе с загруженными файлами следует тщательно проверять, куда вы их загружаете и какого они типа, чтобы избежать уязвимостей. Проверяйте все загружаемые файлы, чтобы убедиться, что они действительно являются тем, чем вы их считаете. Например, если без проверки разрешить загружать файлы в каталог внутри корневого каталога веб-сервера, кто-нибудь может загрузить CGI- или PHP-скрипт и выполнить его, перейдя по URL на вашем сайте. Не допускайте этого.
Также учтите, что даже загруженный HTML-файл может представлять угрозу безопасности, эквивалентную атаке XSS или CSRF, поскольку он может выполняться браузером (но не сервером).
Экземпляры FileField создаются в базе данных как столбцы varchar с максимальной длиной 100 символов по умолчанию. Как и для других полей, максимальную длину можно изменить с помощью аргумента max_length.
FileField и FieldFile
-
class FieldFile[исходный код]
При обращении к FileField модели вы получаете экземпляр FieldFile, который служит прокси для доступа к базовому файлу.
API класса FieldFile повторяет API класса File, но с одним важным отличием: объект, обернутый этим классом, не обязательно является оберткой над встроенным файловым объектом Python. Вместо этого он представляет собой обертку над результатом метода Storage.open(), которым может быть объект File или реализация API File пользовательским хранилищем.
Помимо API, унаследованного от File, например read() и write(), класс FieldFile включает несколько методов для взаимодействия с базовым файлом:
Предупреждение
Два метода этого класса — save() и delete() — по умолчанию сохраняют в базе данных объект модели, связанный с FieldFile.
-
FieldFile.name
Имя файла, включая относительный путь от корня Storage, связанного с FileField.
-
FieldFile.path[исходный код]
Свойство только для чтения, позволяющее получить путь к файлу в локальной файловой системе путем вызова метода path() базового класса Storage.
-
FieldFile.size[исходный код]
Результат вызова базового метода Storage.size().
-
FieldFile.url[исходный код]
Свойство только для чтения, позволяющее получить относительный URL файла путем вызова метода url() базового класса Storage.
-
FieldFile.open(mode='rb')[исходный код]
Открывает или повторно открывает файл, связанный с этим экземпляром, в указанном режиме mode. В отличие от стандартного метода Python open(), этот метод не возвращает файловый дескриптор.
Поскольку базовый файл открывается автоматически при обращении к нему, вызывать этот метод может быть необязательно, за исключением случаев, когда нужно сбросить указатель базового файла или изменить mode.
-
FieldFile.close()[исходный код]
Работает как стандартный метод Python file.close() и закрывает файл, связанный с этим экземпляром.
-
FieldFile.save(name, content, save=True)[исходный код]
Этот метод принимает имя файла и его содержимое, передает их классу хранилища поля, а затем связывает сохраненный файл с полем модели. Если вы хотите вручную связать данные файла с экземплярами FileField в модели, для сохранения этих данных файла используется метод save().
Метод принимает два обязательных аргумента: name — имя файла, и content — объект, содержащий содержимое файла. Необязательный аргумент save определяет, нужно ли сохранять экземпляр модели после изменения файла, связанного с этим полем. По умолчанию задано значение True.
Обратите внимание: аргумент content должен быть экземпляром django.core.files.File, а не встроенным файловым объектом Python. Создать объект File на основе существующего файлового объекта Python можно так:
from django.core.files import File
# Open an existing file using Python's built-in open()
f = open("/path/to/hello.world")
myfile = File(f)
Также его можно создать на основе строки Python следующим образом:
from django.core.files.base import ContentFile
myfile = ContentFile("hello world")
Дополнительные сведения см. в разделе Управление файлами.
-
FieldFile.delete(save=True)[исходный код]
Удаляет файл, связанный с этим экземпляром, и очищает все атрибуты поля. Примечание: этот метод закроет файл, если он открыт на момент вызова delete().
Необязательный аргумент save определяет, нужно ли сохранять экземпляр модели после удаления файла, связанного с этим полем. По умолчанию задано значение True.
Обратите внимание, что при удалении модели связанные с ней файлы не удаляются. Если нужно очистить оставшиеся без привязки файлы, это придется сделать самостоятельно (например, с помощью пользовательской команды управления, которую можно запускать вручную или периодически по расписанию, например через cron).
FilePathField
-
class FilePathField(path='', match=None, recursive=False, allow_files=True, allow_folders=False, max_length=100, **options)[исходный код]
Поле CharField, варианты выбора которого ограничены именами файлов в указанном каталоге файловой системы. Имеет несколько специальных аргументов, первый из которых является обязательным:
-
FilePathField.path -
Обязательный аргумент. Абсолютный путь в файловой системе к каталогу, из которого это поле
FilePathFieldдолжно получать варианты выбора. Пример:"/home/images".Значение
pathтакже может быть вызываемым объектом, например функцией, которая динамически задает путь во время выполнения. Пример:import os from django.conf import settings from django.db import models def images_path(): return os.path.join(settings.LOCAL_FILE_DIR, "images") class MyModel(models.Model): file = models.FilePathField(path=images_path)
-
FilePathField.match -
Необязательный аргумент. Строка с регулярным выражением, которое поле
FilePathFieldбудет использовать для фильтрации имен файлов. Обратите внимание: регулярное выражение применяется к базовому имени файла, а не к полному пути. Пример:"foo.*\.txt$"— ему будет соответствовать файл с именемfoo23.txt, но неbar.txtи неfoo23.png.
-
FilePathField.recursive -
Необязательный аргумент. Значение
TrueилиFalse. По умолчанию —False. Определяет, следует ли включать все подкаталогиpath.
-
FilePathField.allow_files -
Необязательный аргумент. Значение
TrueилиFalse. По умолчанию —True. Определяет, следует ли включать файлы из указанного расположения. Значение этого аргумента или аргументаallow_foldersдолжно быть равноTrue.
-
FilePathField.allow_folders -
Необязательный аргумент. Значение
TrueилиFalse. По умолчанию —False. Определяет, следует ли включать папки из указанного расположения. Значение этого аргумента или аргументаallow_filesдолжно быть равноTrue.
Следует учесть, что match применяется к базовому имени файла, а не к полному пути. Поэтому этот пример:
FilePathField(path="/home/images", match="foo.*", recursive=True)
…соответствует /home/images/foo.png, но не /home/images/foo/bar.png, поскольку match применяется к базовым именам файлов (foo.png и bar.png).
Экземпляры FilePathField создаются в базе данных как столбцы varchar с максимальной длиной 100 символов по умолчанию. Как и для других полей, максимальную длину можно изменить с помощью аргумента max_length.
FloatField
-
class FloatField(**options)[исходный код]
Число с плавающей точкой, представленное в Python экземпляром float.
В качестве виджета формы по умолчанию для этого поля используется NumberInput, если localize равно False, и TextInput в противном случае.
FloatField и DecimalField
Класс FloatField иногда путают с классом DecimalField. Хотя оба класса представляют вещественные числа, делают они это по-разному. Внутри FloatField использует тип Python float, а DecimalField — тип Python Decimal. Сведения о различиях между ними см. в документации Python по модулю decimal.
GeneratedField
-
class GeneratedField(*, expression, output_field, db_persist, **kwargs)[исходный код]
Поле, значение которого всегда вычисляется на основе других полей модели. Это поле обслуживается и обновляется самой базой данных. Использует синтаксис SQL GENERATED ALWAYS.
Существует два вида генерируемых столбцов: хранимые и виртуальные. Значение хранимого генерируемого столбца вычисляется при его записи (вставке или обновлении), и он занимает место в хранилище, как обычный столбец. Виртуальный генерируемый столбец не занимает места в хранилище; его значение вычисляется при чтении. Поэтому виртуальный генерируемый столбец похож на представление, а хранимый — на материализованное представление.
-
GeneratedField.expression -
Выражение
Expression, используемое базой данных для автоматического задания значения поля при каждом изменении модели.Выражения должны быть детерминированными и ссылаться только на поля модели (в той же таблице базы данных). Генерируемые поля не могут ссылаться на другие генерируемые поля. Бэкенды баз данных могут накладывать дополнительные ограничения.
-
GeneratedField.output_field -
Экземпляр поля модели, задающий тип данных поля.
-
GeneratedField.db_persist -
Определяет, должен ли столбец базы данных занимать место в хранилище, как обычный столбец. Если задано значение
False, столбец является виртуальным и не занимает места в хранилище базы данных.PostgreSQL поддерживает только сохраняемые столбцы. Oracle поддерживает только виртуальные столбцы.
Ограничения баз данных
Для генерируемых полей существует множество ограничений, специфичных для конкретных баз данных. Django их не проверяет, поэтому база данных может выдать ошибку. Например, PostgreSQL требует, чтобы функции и операторы, на которые ссылается генерируемый столбец, были помечены как IMMUTABLE.
Всегда проверяйте, поддерживается ли expression вашей базой данных. См. документацию MariaDB, MySQL, Oracle, PostgreSQL или SQLite.
Теперь значения GeneratedField автоматически обновляются из базы данных на бэкендах, которые это поддерживают (SQLite, PostgreSQL и Oracle), а на остальных бэкендах помечаются как отложенные.
GenericIPAddressField
-
class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)[исходный код]
Адрес IPv4 или IPv6 в строковом формате (например, 192.0.2.30 или 2a02:42fe::4). Виджет формы по умолчанию для этого поля — TextInput.
Нормализация адреса IPv6 соответствует разделу 2.2 RFC 4291, раздел 2.2, включая использование формата IPv4, предложенного в пункте 3 этого раздела, например ::ffff:192.0.2.0. Например, 2001:0::0:01 будет нормализован в 2001::1, а ::ffff:0a0a:0a0a — в ::ffff:10.10.10.10. Все символы преобразуются в нижний регистр.
-
GenericIPAddressField.protocol -
Ограничивает допустимые значения указанным протоколом. Допустимые значения:
'both'(по умолчанию),'IPv4'или'IPv6'. Сравнение не учитывает регистр.
-
GenericIPAddressField.unpack_ipv4 -
Распаковывает адреса IPv4, отображённые в IPv6, например
::ffff:192.0.2.1. Если этот параметр включён, такой адрес будет распакован в192.0.2.1. По умолчанию отключён. Можно использовать, только если дляprotocolзадано значение'both'.
Если вы допускаете пустые значения, необходимо также допускать значения null, поскольку пустые значения хранятся как null.
ImageField
-
class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)[исходный код]
Наследует все атрибуты и методы FileField, но также проверяет, что загруженный объект является допустимым изображением.
Помимо специальных атрибутов, доступных для FileField, ImageField также имеет атрибуты height и width.
Для удобства выполнения запросов по этим атрибутам ImageField имеет следующие необязательные аргументы:
-
ImageField.height_field -
Имя поля модели, которое автоматически заполняется высотой изображения при каждом присваивании объекта изображения.
-
ImageField.width_field -
Имя поля модели, которое автоматически заполняется шириной изображения при каждом присваивании объекта изображения.
Требуется библиотека pillow.
Экземпляры ImageField создаются в базе данных как столбцы varchar с максимальной длиной 100 символов по умолчанию. Как и для других полей, максимальную длину можно изменить с помощью аргумента max_length.
Виджет формы по умолчанию для этого поля — ClearableFileInput.
IntegerField
-
class IntegerField(**options)[исходный код]
Целое число. Допустимы только значения в определённых пределах (зависящих от базы данных). Значения от -2147483648 до 2147483647 совместимы со всеми базами данных, поддерживаемыми Django.
Для проверки введённых данных с учётом значений, поддерживаемых базой данных по умолчанию, используются MinValueValidator и MaxValueValidator.
Виджетом формы по умолчанию для этого поля является NumberInput, если localize имеет значение False, и TextInput в противном случае.
JSONField
-
class JSONField(encoder=None, decoder=None, **options)[исходный код]
Поле для хранения данных в формате JSON. В Python данные представлены в собственных типах Python: словарях, списках, строках, числах, логических значениях и None.
JSONField поддерживается в MariaDB, MySQL, Oracle, PostgreSQL и SQLite (с включённым расширением JSON1).
-
JSONField.encoder -
Необязательный подкласс
json.JSONEncoderдля сериализации типов данных, не поддерживаемых стандартным сериализатором JSON (например,datetime.datetimeилиUUID). Например, можно использовать классDjangoJSONEncoder.По умолчанию —
json.JSONEncoder.
-
JSONField.decoder -
Необязательный подкласс
json.JSONDecoderдля десериализации значения, полученного из базы данных. Значение будет иметь формат, выбранный пользовательским кодировщиком (чаще всего это строка). При десериализации может потребоваться учитывать, что вы не можете быть уверены в типе входных данных. Например, существует риск вернутьdatetime, которое на самом деле было строкой, случайно имеющей тот же формат, что и выбранный дляdatetime.По умолчанию —
json.JSONDecoder.
Сведения о запросах к JSONField в базе данных см. в разделе Запросы к JSONField.
Значение по умолчанию
Если вы задаёте для поля default, убедитесь, что это вызываемый объект, например класс dict или функция, возвращающая новый объект при каждом вызове. Неправильное использование изменяемого объекта, например default={} или default=[], создаёт изменяемое значение по умолчанию, совместно используемое всеми экземплярами.
Индексация
Index и Field.db_index создают B-tree-индекс, который не особенно полезен при запросах к JSONField. Только в PostgreSQL можно использовать GinIndex, который для этого подходит лучше.
Пользователям PostgreSQL
В PostgreSQL есть два встроенных типа данных на основе JSON: json и jsonb. Главное различие между ними заключается в способе хранения и выполнения запросов. Поле json в PostgreSQL хранится в исходном строковом представлении JSON и при запросах по ключам должно декодироваться на лету. Поле jsonb хранится с учётом фактической структуры JSON, что позволяет создавать индексы. Компромисс заключается в небольших дополнительных затратах при записи в поле jsonb. JSONField использует jsonb.
PositiveBigIntegerField
-
class PositiveBigIntegerField(**options)[исходный код]
Как PositiveIntegerField, но допускает только значения ниже определённого предела (зависящего от базы данных). Значения от 0 до 9223372036854775807 совместимы со всеми базами данных, поддерживаемыми Django.
PositiveIntegerField
-
class PositiveIntegerField(**options)[исходный код]
Как IntegerField, но значение должно быть положительным или равным нулю (0). Допускаются только значения ниже определённого предела (зависящего от базы данных). Значения от 0 до 2147483647 совместимы со всеми базами данных, поддерживаемыми Django. Значение 0 принимается для обратной совместимости.
PositiveSmallIntegerField
-
class PositiveSmallIntegerField(**options)[исходный код]
Как PositiveIntegerField, но допускает только значения ниже определённого предела (зависящего от базы данных). Значения от 0 до 32767 совместимы со всеми базами данных, поддерживаемыми Django.
SlugField
-
class SlugField(max_length=50, **options)[исходный код]
Slug — термин из газетного дела. Slug — это короткая метка для чего-либо, состоящая только из букв, цифр, подчёркиваний или дефисов. Обычно их используют в URL.
Как и для CharField, можно указать max_length (ознакомьтесь также с примечанием о переносимости баз данных и max_length в этом разделе). Если max_length не указан, Django использует длину по умолчанию 50.
Автоматически устанавливает для Field.db_index значение True.
Часто бывает полезно автоматически заполнять SlugField на основе значения другого поля. Это можно настроить автоматически в административном интерфейсе с помощью prepopulated_fields.
Для проверки используются validate_slug или validate_unicode_slug.
-
SlugField.allow_unicode -
Если задано значение
True, поле принимает символы Unicode в дополнение к буквам ASCII. По умолчанию —False.
SmallAutoField
-
class SmallAutoField(**options)[исходный код]
Как AutoField, но допускает только значения ниже определённого предела (зависящего от базы данных). Значения от 1 до 32767 совместимы со всеми базами данных, поддерживаемыми Django.
SmallIntegerField
-
class SmallIntegerField(**options)[исходный код]
Как IntegerField, но допускает только значения ниже определённого предела (зависящего от базы данных). Значения от -32768 до 32767 совместимы со всеми базами данных, поддерживаемыми Django.
TextField
-
class TextField(**options)[исходный код]
Поле для большого объёма текста. Виджет формы по умолчанию для этого поля — Textarea.
Если указать атрибут max_length, он будет отражён в виджете Textarea автоматически созданного поля формы. Однако на уровне модели или базы данных он не применяется. Для этого используйте CharField.
-
TextField.db_collation -
Необязательный параметр. Название сортировки поля в базе данных.
Примечание
Названия сортировок не стандартизированы. Поэтому этот параметр не будет переносимым между разными серверными частями баз данных.
Oracle
Oracle не поддерживает сортировки для
TextField.
TimeField
-
class TimeField(auto_now=False, auto_now_add=False, **options)[исходный код]
Время, представленное в Python экземпляром datetime.time. Поддерживает те же параметры автоматического заполнения, что и DateField.
Виджет формы по умолчанию для этого поля — TimeInput. В административном интерфейсе добавлены некоторые сочетания клавиш JavaScript.
URLField
-
class URLField(max_length=200, **options)[исходный код]
CharField для URL, проверяемого с помощью URLValidator.
Виджет формы по умолчанию для этого поля — URLInput.
Как и все подклассы CharField, URLField принимает необязательный аргумент max_length. Если не указать max_length, будет использовано значение по умолчанию 200.
UUIDField
-
class UUIDField(**options)[исходный код]
Поле для хранения универсальных уникальных идентификаторов. Использует класс Python UUID. При использовании в PostgreSQL и MariaDB 10.7+ данные хранятся в типе данных uuid, в противном случае — в char(32).
Универсальные уникальные идентификаторы — хорошая альтернатива AutoField для primary_key. База данных не будет генерировать UUID за вас, поэтому рекомендуется использовать default:
import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
# other fields
Обратите внимание, что в default передаётся вызываемый объект (без скобок), а не экземпляр UUID.
Поиск в PostgreSQL и MariaDB 10.7+
Использование поисковых выражений iexact, contains, icontains, startswith, istartswith, endswith или iendswith в PostgreSQL не работает для значений без дефисов, поскольку PostgreSQL и MariaDB 10.7+ хранят их в виде типа данных uuid с дефисами.
Справочник по API полей
-
class Field[исходный код] -
Field— это абстрактный класс, представляющий столбец таблицы базы данных. Django использует поля для создания таблицы базы данных (db_type()), преобразования типов Python в типы базы данных (get_prep_value()) и обратно (from_db_value()).Таким образом, поле — это важная составляющая различных API Django, в частности,
modelsиquerysets.В моделях поле создаётся как атрибут класса и представляет отдельный столбец таблицы; см. раздел Модели. У поля есть такие атрибуты, как
nullиunique, а также методы, которые Django использует для преобразования значения поля в значения, специфичные для базы данных.Fieldявляется подклассомRegisterLookupMixin, поэтому для него можно зарегистрировать какTransform, так иLookup, чтобы использовать их вQuerySet(например,field_name__exact="foo"). Все встроенные условия поиска зарегистрированы по умолчанию.Все встроенные поля Django, например
CharField, являются отдельными реализациямиField. Если вам нужно пользовательское поле, можно создать подкласс любого встроенного поля или написатьFieldс нуля. В обоих случаях см. раздел Создание пользовательских полей модели.-
description -
Подробное описание поля, например для приложения
django.contrib.admindocs.Описание может иметь следующий формат:
description = _("String (up to %(max_length)s)")где аргументы подставляются из
__dict__поля.
-
descriptor_class -
Класс, реализующий протокол дескрипторов, который создаётся и назначается атрибуту экземпляра модели. Конструктор должен принимать один аргумент — экземпляр
Field. Переопределение этого атрибута класса позволяет настроить поведение получения и установки значения.
Для преобразования
Fieldв тип, специфичный для базы данных, Django предоставляет несколько методов:-
get_internal_type()[исходный код] -
Возвращает строку с названием этого поля для внутренних нужд бэкенда. По умолчанию возвращается имя класса.
Примеры использования в пользовательских полях см. в разделе Имитация встроенных типов полей.
-
db_type(connection)[исходный код] -
Возвращает тип данных столбца базы данных для
Fieldс учётомconnection.Примеры использования в пользовательских полях см. в разделе Пользовательские типы данных базы данных.
-
rel_db_type(connection)[исходный код] -
Возвращает тип данных столбца базы данных для таких полей, как
ForeignKeyиOneToOneField, которые ссылаются наField, с учётомconnection.Примеры использования в пользовательских полях см. в разделе Пользовательские типы данных базы данных.
Есть три основных ситуации, в которых Django необходимо взаимодействовать с бэкендом базы данных и полями:
- при выполнении запроса к базе данных (значение Python -> значение бэкенда базы данных)
- при загрузке данных из базы данных (значение бэкенда базы данных -> значение Python)
- при сохранении в базе данных (значение Python -> значение бэкенда базы данных)
При выполнении запроса используются
get_db_prep_value()иget_prep_value():-
get_prep_value(value)[исходный код] -
value— это текущее значение атрибута модели; метод должен возвращать данные в формате, подготовленном для использования в качестве параметра запроса.Примеры использования см. в разделе Преобразование объектов Python в значения запроса.
-
get_db_prep_value(value, connection, prepared=False)[исходный код] -
Преобразует
valueв значение, специфичное для бэкенда. По умолчанию возвращаетvalue, еслиprepared=True, иget_prep_value(), еслиFalse.Примеры использования см. в разделе Преобразование значений запроса в значения базы данных.
При загрузке данных используется
from_db_value():-
from_db_value(value, expression, connection) -
Преобразует значение, полученное из базы данных, в объект Python. Это обратная операция по отношению к
get_prep_value().Для большинства встроенных полей этот метод не используется, поскольку бэкенд базы данных уже возвращает правильный тип Python или выполняет преобразование самостоятельно.
expressionсовпадает сself.Примеры использования см. в разделе Преобразование значений в объекты Python.
Примечание
В целях повышения производительности
from_db_valueне реализован как пустая операция для полей, которым он не требуется (то есть для всех полей Django). Поэтому вы не можете вызыватьsuperв своём определении.
При сохранении используются
pre_save()иget_db_prep_save():-
get_db_prep_save(value, connection)[исходный код] -
То же, что и
get_db_prep_value(), но вызывается, когда значение поля нужно сохранить в базе данных. По умолчанию возвращаетget_db_prep_value().
-
pre_save(model_instance, add)[исходный код] -
Метод, вызываемый перед
get_db_prep_save()для подготовки значения перед сохранением (например, дляDateField.auto_now).model_instance— это экземпляр, которому принадлежит данное поле, аaddуказывает, сохраняется ли экземпляр в базе данных впервые.Метод должен возвращать значение соответствующего атрибута из
model_instanceдля этого поля. Имя атрибута содержится вself.attname(оно задаётся методомField).Примеры использования см. в разделе Предварительная обработка значений перед сохранением.
Часто значения полей поступают в другом типе — например, при десериализации или из форм.
-
to_python(value)[исходный код] -
Преобразует значение в объект Python правильного типа. Этот метод является обратным по отношению к
value_to_string(), а также вызывается вclean().Примеры использования см. в разделе Преобразование значений в объекты Python.
Помимо сохранения в базе данных, поле должно уметь сериализовать своё значение:
-
value_from_object(obj)[исходный код] -
Возвращает значение поля для заданного экземпляра модели.
Этот метод часто используется методом
value_to_string().
-
value_to_string(obj)[исходный код] -
Преобразует
objв строку. Используется для сериализации значения поля.Примеры использования см. в разделе Преобразование данных поля для сериализации.
При использовании
model formsобъектуFieldнеобходимо знать, каким полем формы следует его представить:-
formfield(form_class=None, choices_form_class=None, **kwargs)[исходный код] -
Возвращает поле формы
django.forms.Fieldпо умолчанию дляModelForm.Если переопределённый метод
formfield()возвращаетNone, это поле исключается изModelForm.По умолчанию, если и
form_class, иchoices_form_classимеют значениеNone, используетсяCharField. Если у поля естьchoices, аchoices_form_classне задан, используетсяTypedChoiceField.Примеры использования см. в разделе Указание поля формы для поля модели.
-
deconstruct()[исходный код] -
Возвращает кортеж из четырёх элементов с данными, достаточными для повторного создания поля:
- Имя поля в модели.
- Путь импорта поля (например,
"django.db.models.IntegerField"). Следует использовать наиболее переносимую версию, поэтому менее конкретный вариант может быть предпочтительнее. - Список позиционных аргументов.
- Словарь именованных аргументов.
Этот метод необходимо добавить в поля, созданные до версии 1.7, чтобы перенести их данные с помощью миграций.
-
Регистрация и получение условий поиска
Field реализует API регистрации условий поиска. Этот API позволяет настраивать доступные для класса поля и его экземпляров условия поиска, а также способ получения условий поиска из поля.
Справочник по атрибутам полей
Каждый экземпляр Field содержит несколько атрибутов, позволяющих анализировать его поведение. Используйте эти атрибуты вместо проверок isinstance, если нужно написать код, зависящий от функциональности поля. Их можно использовать вместе с API Model._meta, чтобы сузить поиск конкретных типов полей. Пользовательские поля модели должны реализовывать эти флаги.
Атрибуты полей
-
Field.auto_created -
Логический флаг, указывающий, было ли поле создано автоматически, например
OneToOneField, используемое при наследовании моделей.
-
Field.concrete -
Логический флаг, указывающий, связан ли столбец базы данных с полем.
-
Логический флаг, указывающий, является ли поле скрытым и должно ли оно по умолчанию исключаться из результатов
Options.get_fields(). Например, таково обратное поле дляForeignKey, у которогоrelated_nameначинается с'+'.
-
Field.is_relation -
Логический флаг, указывающий, содержит ли поле ссылки на одну или несколько других моделей, необходимые для его работы (например,
ForeignKey,ManyToManyField,OneToOneFieldи т. д.).
-
Field.model -
Возвращает модель, в которой определено поле. Если поле определено в суперклассе модели,
modelбудет ссылаться на суперкласс, а не на класс экземпляра.
Атрибуты полей со связями
Эти атрибуты используются для получения сведений о кратности и других характеристиках связи. Они присутствуют у всех полей, однако булевы значения (вместо None) у них будут только в том случае, если поле является типом связи (Field.is_relation=True).
-
Field.many_to_many -
Логический флаг, равный
True, если поле имеет связь «многие ко многим», иFalseв противном случае. Единственное поле Django, для которого это значение равноTrue, —ManyToManyField.
-
Field.many_to_one -
Логический флаг, равный
True, если поле имеет связь «многие к одному», напримерForeignKey, иFalseв противном случае.
-
Field.one_to_many -
Логический флаг, равный
True, если поле имеет связь «один ко многим», напримерGenericRelationили обратную связь дляForeignKey, иFalseв противном случае.
-
Field.one_to_one -
Логический флаг, равный
True, если поле имеет связь «один к одному», напримерOneToOneField, иFalseв противном случае.
-
Указывает модель, с которой связано поле. Например,
AuthorвForeignKey(Author, on_delete=models.CASCADE). Значениеrelated_modelдляGenericForeignKeyвсегда равноNone.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/models/fields/