Справочник по полям модели¶
Этот раздел содержит все существующие подробности о всех параметрах поля и типах полей в Django.
См.также
Если встроенные поля не помогают, вы можете попробовать django-localflavor (документация), которая содержит различные фрагменты кода, полезные для определенных стран и культур.
Также вы можете легко создать собственное поле для модели.
Примечание
Поля определены в django.db.models.fields, но для удобства они импортированы в django.db.models. Стандартное соглашение — использовать модели импорта из django.db и называть поля «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",
}
Вы также можете передать sequence, состоящую из итераций ровно двух элементов (например, [(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)
Передача вызываемого объекта для выбора может быть особенно удобной, когда, например, варианты выбора:
результат операций ввода-вывода (которые потенциально могут быть кэшированы), таких как запрос таблицы в той же или внешней базе данных или доступ к выбору из статического файла.
список, который в основном стабилен, но может меняться время от времени или от проекта к проекту. Примерами в этой категории являются использование сторонних приложений, которые предоставляют общеизвестный перечень значений, таких как валюты, страны, языки, часовые пояса и т. д.
Значения лучше указать в константах внутри модели:
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",
}
Ключом сопоставления является имя, применяемое к группе, а значение — это варианты выбора внутри этой группы, состоящие из значения поля и удобочитаемого имени параметра. Сгруппированные параметры можно комбинировать с разгруппированными параметрами в рамках одного сопоставления (например, параметр «неизвестно» в этом примере).
Вы также можете использовать последовательность, например. список 2-кортежей:
MEDIA_CHOICES = [
(
"Audio",
(
("vinyl", "Vinyl"),
("cd", "CD"),
),
),
(
"Video",
(
("vhs", "VHS Tape"),
("dvd", "DVD"),
),
),
("unknown", "Unknown"),
]
Отметим что в качестве списка вариантов значений может быть любой итератор – не обязательно список или кортеж. Это позволяет определять варианты значений динамически. Но, если вам необходимо использовать динамический choices, возможно вам следует использовать правильную структуру таблицы базы данных с ForeignKey. choices предназначен для статических данных, которые почти или вообще не изменяются.
Примечание
Новая миграция создается каждый раз, когда меняется порядок «выборов».
Для каждого поля модели, у которого установлен choices, Django нормализует варианты выбора в список из двух кортежей и добавит метод для получения удобочитаемого имени для текущего значения поля. См. 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 поддерживает добавление дополнительного строкового значения в конец этого кортежа, которое будет использоваться в качестве удобочитаемого имени или «метки». Метка может быть ленивой переводимой строкой. Таким образом, в большинстве случаев значением элемента будет двухкортеж
(value, 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)
Также можно использовать Enum Functional API с оговоркой, что метки генерируются автоматически, как указано выше:
>>> 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, default будет иметь приоритет при создании экземпляров в коде Python. db_default по-прежнему будет установлен на уровне базы данных и будет использоваться при вставке строк за пределами ORM или при добавлении нового поля в миграции.
Если поле имеет db_default без установленного default и этому полю не присвоено никакого значения, объект DatabaseDefault возвращается в качестве значения поля в несохраненных экземплярах модели. Фактическое значение поля определяется базой данных при сохранении экземпляра модели.
db_index¶
- Field.db_index¶
При True для поля будет создан индекс в базе данных.
db_tablespace¶
- Field.db_tablespace¶
Имя «tablespace» базы данных используемое для индекса поля, если поле имеет индекс. По-умолчанию используется значение настройки DEFAULT_INDEX_TABLESPACE проекта, если оно указано, иначе db_tablespace модели. Если база данных не поддерживает «tablespace» для индексов, этот параметр будет проигнорирован.
default¶
- Field.default¶
Значение по умолчанию для поля. Это может быть значение или вызываемый(callable) объект. Если это вызываемый объект, он будет вызван при создании нового объекта.
Значение по умолчанию не может быть изменяемым объектом (экземпляр модели, «список», «набор» и т. д.), поскольку ссылка на один и тот же экземпляр этого объекта будет использоваться в качестве значения по умолчанию во всех новых экземплярах модели. Вместо этого оберните желаемое значение по умолчанию в вызываемый объект. Например, если вы хотите указать dict по умолчанию для JSONField, используйте функцию:
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. Он также будет пропущен во время проверки модели <validating-objects>`. По умолчанию установлено True.
error_messages¶
- Field.error_messages¶
error_messages позволяет переопределить сообщения ошибок возвращаемых полем. Используйте словарь с ключами соответствующими необходимым ошибкам.
Ключи ошибок такие: null, blank, invalid, invalid_choice, unique и ``unique_for_date`. Дополнительные ошибки указаны для каждого типа поля ниже.
Эти сообщения об ошибках часто не распространяются на формы. См. соображения относительно сообщений об ошибках модели.
help_text¶
- Field.help_text¶
Подсказка, отображаемая под полем в интерфейсе администратора. Это полезно для описания поля, даже если модель не используется в форме.
Заметим, что, при отображении в форме, HTML-символы не экранируются. Это позволяет использовать HTML в help_text если вам необходимо. Например:
help_text = "Please use the following format: <em>YYYY-MM-DD</em>."
Также вы можете использовать обычный текст и django.utils.html.escape(), чтобы экранировать HTML. Убедитесь, что вы экранируете все подсказки, которые могут определять непроверенные пользователи, чтобы избежать XSS атак.
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 при удалении <django.db.models.Model.delete>` объекта.
Было добавлено поле CompositePrimaryKey.
unique¶
- Field.unique¶
При True значение поля должно быть уникальным.
Этот параметр учитывается при сохранении в базу данных и при проверке данных в модели. Если вы попытаетесь сохранить повторное значение в поле с unique, будет вызвана ошибка django.db.IntegrityError методом save().
Этот параметр можно использовать для любого типа поля кроме ManyToManyField, OneToOneField и FileField.
Заметим что, при 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. Используется для хранения ID. Скорее всего вам не придется использовать это поле, первичный ключ будет автоматически добавлен к модели. Смотрите Первичный ключ по умолчанию.
AutoField¶
- class BigAutoField(**options)¶
64-битное целочисленное, аналогично IntegerField но позволяет хранить числа от -9223372036854775808 до 9223372036854775807. Форма будет использовать TextInput для отображения.
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)¶
Поле хранящее значение true/false.
Виджет по умолчанию в форме для этого поля - NumberInput, если localize равен False, иначе TextInput.
Значение по умолчанию для 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для некоторых типов баз данных. Смотрите раздел про использование различных типов баз данных.Changed in Django 5.2:В SQLite добавлена поддержка неограниченного количества столбцов VARCHAR.
- CharField.db_collation¶
Необязательный. Имя сопоставления базы данных для поля.
Примечание
Имена параметров сортировки не стандартизированы. Таким образом, это не будет переноситься между несколькими базами данных.
Оракул
Oracle поддерживает сопоставление только в том случае, если для параметра инициализации базы данных MAX_STRING_SIZE установлено значение EXTENDED.
DateField¶
- class DateField(auto_now=False, auto_now_add=False, **options)¶
Дата, представленная в виде объекта datetime.date Python. Принимает несколько дополнительных параметров:
- 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, удалив его компонент времени. Это справедливо как для хранения, так и для сравнения.
Предупреждение
В PostgreSQL и MySQL арифметические операции над DateField с timedelta возвращают datetime вместо date. Это происходит потому, что timedelta Python преобразуется в INTERVAL SQL, а операция SQL date +/- интервал возвращает метку времени в этих базах данных.
Чтобы обеспечить результат «дата», используйте один из следующих подходов. Либо явно приведите результат к дате:
import datetime
from django.db.models import DateField, F
from django.db.models.functions import Cast
qs = MyModel.objects.annotate(
previous_day=Cast(
F("date_field") - datetime.timedelta(days=1),
output_field=DateField(),
)
)
Или только в PostgreSQL используйте целочисленную арифметику для представления дней:
from django.db.models import DateField, ExpressionWrapper, F
qs = MyModel.objects.annotate(
previous_day=ExpressionWrapper(
F("date_field") - 1, # Subtract 1 day as integer
output_field=DateField(),
)
)
DateTimeField¶
- class DateTimeField(auto_now=False, auto_now_add=False, **options)¶
Дата и время, представленные объектом datetime.datetime Python. Принимает аналогичные параметры что и 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)¶
Десятичное число с фиксированной точностью, представленное объектом Decimal Python. Принимает два обязательных параметра:
Имеет следующие обязательные аргументы:
- 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 vs. DecimalField.
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 для хранения правильного email-адреса. Использует EmailValidator для проверки значения.
FileField¶
- class FileField(upload_to='', storage=None, max_length=100, **options)¶
Поле для загрузки файла.
Примечание
primary_key и unique не принимаются, и вызовут исключение TypeError при использовании.
Имеет следующие необязательные аргументы:
- FileField.upload_to¶
Этот атрибут позволяет указать каталог и название файла при его сохранении. Его можно использовать двумя способами. В обоих случаях значение будет передано в метод
Storage.save().Поддерживает форматирование
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 (с прямыми слэшами), который будет передан в систему хранения файлов(storage). Два аргумента это:Аргумент
Описание
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, чтобы указать Django в каком подкаталоге вMEDIA_ROOTдолжны быть сохранены файлы.Все, что будет сохранено в базе данных, это путь к файлу (относительно
MEDIA_ROOT). Скорее всего вы будете использоватьurlпредоставленную Django. Например, еслиImageFieldназванmug_shot, вы можете получить URL к файлу в шаблоне используя{{ object.mug_shot.url }}.
Например, MEDIA_ROOT равен '/home/media', и upload_to равен 'photos/%Y/%m/%d'. '%Y/%m/%d' часть параметра upload_to это форматирование strftime(); '%Y' – год из 4-х цифр, '%m' – номер месяца из 2-х цифр и '%d' – число месяца из 2-х цифр. Если вы загрузили файл 15 января 2007, он будет сохранен в каталоге /home/media/photos/2007/01/15.
Если вам нужны название файла или его размер, используйте атрибуты name и size соответственно; больше информации о доступных методах и атрибутах вы найдете в справке о File и разделе документации Управление файлами.
Примечание
Процесс сохранения файла – часть процесса сохранения объекта, таким образом имя файла, сохраненного на диске, не будет доступно, пока объект не будет сохранен.
Чтобы получить URL к загруженному файлу, используйте атрибут url. При этом будет вызван метод url() класса Storage.
Обратите внимание: всякий раз, когда вы имеете дело с загруженными файлами, вам следует внимательно следить за тем, куда вы их загружаете и какого типа файлы, чтобы избежать дыр в безопасности. Проверьте все загруженные файлы, чтобы убедиться, что они соответствуют вашим представлениям. Например, если вы слепо позволяете кому-либо загружать файлы без проверки в каталог, находящийся в корне документа вашего веб-сервера, тогда кто-то может загрузить сценарий CGI или PHP и выполнить этот сценарий, посетив его URL-адрес на вашем сайте. Не позволяй этому.
Также заметим что это относится и к HTML файлам, так как они могу быть выполнены в браузере(хоть и не на сервере), и нести угрозу XSS или CSRF атаки.
По-умолчанию, экземпляр FileField создается как колонка varchar в базе данных. Как и с другими полями, вы можете изменить максимальную длину, используя аргумент max_length.
FileField и FieldFile¶
- class FieldFile¶
При доступе к FileField модели, вы получаете экземпляр FieldFile как «proxy» для работы с файлом. Этот класс содержит несколько дополнительных атрибутов и методов для работы с файлом, кроме унаследованных от django.core.files.File:
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¶
read-only свойство для получения URL вызовом метода url() класса Storage.
- FieldFile.open(mode='rb')¶
Открывает или повторно открывает файл, связанный с этим экземпляром, в указанном режиме. В отличие от стандартного метода Python open(), он не возвращает дескриптор файла.
Поскольку базовый файл открывается неявно при доступе к нему, возможно, нет необходимости вызывать этот метод, кроме как для сброса указателя на базовый файл или для изменения режима.
- FieldFile.close()¶
Работает так же как и метод file.close() в Python и закрывает файл связанный с объектом.
- FieldFile.save(name, content, save=True)¶
Этот метод принимает имя файла и содержимое и передает его в экземпляр класса «storage» этого поля, потом добавляет файл в модель. Если вы хотите самостоятельно добавить содержимое файла в поле 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)
Или же создать из строки с содержимым файла:
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.gif.
- FilePathField.recursive¶
Необязательный. Принимает
TrueилиFalse. По-умолчаниюFalse. Определяет, должны ли быть включены подкаталогиpath.
- FilePathField.allow_files¶
Необязательный. Либо
True, либоFalse. По умолчанию установленоTrue. Указывает, следует ли включать файлы в указанном расположении. Либо это, либоallow_foldersдолжно бытьTrue.
- FilePathField.allow_folders¶
Необязательный. Либо
True, либо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)¶
Число с плавающей точкой представленное объектом float.
Виджет по умолчанию в форме для этого поля - NumberInput, если localize равен False, иначе TextInput.
FloatField или DecimalField
FloatField иногда путают с DecimalField. Хоть оба и представляют вещественные числа, они делают это по разному. FloatField использует тип float в Python, в то время как DecimalField использует тип 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.
Вы всегда должны проверять, поддерживается ли выражение в вашей базе данных. Ознакомьтесь с документацией 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 происходит в соответствии с RFC 4291 Section 2.2 раздел 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¶
Определяет формат IP адреса. Принимает значение
'both'(по умолчанию),'IPv4'или'IPv6'. Значение не чувствительно регистру.
- GenericIPAddressField.unpack_ipv4¶
Преобразует адрес IPv4. Если эта опция установлена, адрес
::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 в базе данных. Как и с другими полями вы можете изменить максимальную длину используя аргумент 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: словари, списки, строки, числа, логические значения и «Нет».
JSONField поддерживается в MariaDB, MySQL, Oracle, PostgreSQL и SQLite (с включенным расширением JSON1).
- JSONField.encoder¶
Необязательный подкласс
json.JSONEncoderдля сериализации типов данных, не поддерживаемых стандартным сериализатором JSON (например,datetime.datetimeилиUUID). Например, вы можете использовать классDjangoJSONEncoder.По умолчанию используется
json.JSONEncoder.
- JSONField.decoder¶
Необязательный подкласс
json.JSONDecoderдля десериализации значения, полученного из базы данных. Значение будет в формате, выбранном пользовательским кодировщиком (чаще всего это строка). При десериализации может потребоваться учитывать тот факт, что вы не можете быть уверены в типе входных данных. Например, вы рискуете вернутьdatetime, которое на самом деле было строкой, которая случайно оказалась в том же формате, который был выбран дляdatetimes.По умолчанию используется
json.JSONDecoder.
Чтобы запросить JSONField в базе данных, см. Запрос JSONField.
Значение по умолчанию
Если вы присвоите полю default, убедитесь, что это вызываемый объект, такой как класс dict или функция, которая каждый раз возвращает новый объект. Неправильное использование изменяемого объекта, такого как default={} или default=[], создает изменяемое значение по умолчанию, которое является общим для всех экземпляров.
Индексирование
Index и Field.db_index оба создают индекс B-дерева, что не особенно полезно при запросе JSONField. Только в PostgreSQL вы можете использовать GinIndex, который лучше подходит.
Пользователи PostgreSQL
PostgreSQL имеет два собственных типа данных на основе JSON: json и jsonb. Основное различие между ними заключается в том, как они хранятся и как их можно запрашивать. Поле json в PostgreSQL хранится как исходное строковое представление JSON и должно декодироваться на лету при запросе на основе ключей. Поле jsonb хранится на основе фактической структуры JSON, что позволяет индексировать. Компромиссом являются небольшие дополнительные затраты на запись в поле jsonb. JSONField использует jsonb.
Пользователи Oracle
База данных Oracle не поддерживает хранение скалярных значений JSON. Поддерживаются только объекты и массивы JSON (представленные в Python с помощью dict и list).
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 — газетный термин. Слаг — это короткое обозначение чего-либо, содержащее только буквы, цифры, символы подчеркивания или дефисы. Обычно они используются в URL-адресах.
Как и для CharField, можно указать 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.
AutoField¶
- 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 не поддерживает параметры сортировки для TextField.
TimeField¶
- class TimeField(auto_now=False, auto_now_add=False, **options)¶
Время, представленное объектом datetime.time Python. Принимает те же аргументы, что и DateField.
Виджет формы по умолчанию для этого поля — TimeInput. Администратор добавляет несколько ярлыков JavaScript.
URLField¶
- class URLField(max_length=200, **options)¶
Поле CharField для хранения правильного email-адреса. Использует EmailValidator для проверки значения.
Виджет формы по умолчанию для этого поля — URLInput.
Как подкласс CharField URLField принимает необязательный аргумент max_length. Если вы не укажите max_length, будет использовано значение – 200.
UUIDField¶
- class UUIDField(**options)¶
Поле для хранения универсально уникальных идентификаторов. Использует класс Python UUID. При использовании в PostgreSQL и MariaDB 10.7+ он сохраняется в типе данных uuid, в противном случае — в char(32).
UUID является хорошей альтернативой 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, написанном через дефис.
Справочник по полям модели¶
- class Field¶
Field– абстрактный класс, отображающий колонку в таблице в базе данных. Django используется поля для создания таблицы в базе данных (db_type()), для преобразования типов Python в типа в базе данных (get_prep_value()) и наоборот (from_db_value()), и для применения Справочник по API поиска (get_prep_lookup()).Таким образом поле является фундаментальной частью различных 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)¶
Возвращает тип поля в базе данных
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(value)в противном случае.Смотрите Преобразование значения из запроса в значение базы данных.
При загрузке данных используется
from_db_value():- from_db_value(value, expression, connection)¶
Преобразует значение из базы данных в объект Python. Метод обратный
get_prep_value().Для большинства встроенных полей этот метод не используется т.к. бэкенд базы данных возвращает уже правильный объект Python, или же бэкенд сам выполняет необходимые преобразования.
выражение— то же самое, что и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в строку. Используется при сериализации значения поля.
При использовании
django.forms.ModelFormFieldдолжно указать, какое поле формы необходимо использовать для его представления в форме:- formfield(form_class=None, choices_form_class=None, **kwargs)¶
Возвращает
django.forms.Fieldполя модели дляModelForm.Если
formfield()переопределяется для возвратаNone, это поле исключается изModelForm.По умолчанию, если
form_classиchoices_form_classравныNone, возвращаетCharField. Если указанchoices_form_class, вернетTypedChoiceField.Смотрите Определение поля формы для поля модели.
- deconstruct()¶
Возвращает 4-х элементный кортеж с информацией, как воссоздать поле:
Название поля в модели.
Путь для импорта класса поля (например,
"django.db.models.IntegerField"). Должен возвращаться максимально переносимый между платформами и версиями вариант.Список позиционных аргументов.
Словарь именованных аргументов.
Этот метод должен быть добавлен полям, созданным до 1.7, для использования Миграции.
Регистрация и загрузка операторов для фильтрации¶
Field реализует API регистрации поиска. API можно использовать для настройки поиска, доступного для класса поля и его экземпляров, а также способа извлечения запросов из поля.
Атрибуты поля¶
Каждый экземпляр Field содержит атрибуты, определяющие поведение поля. Используйте эти атрибуты вместо проверки isinstance, если вам необходимо написать код, который зависит от поведения поля. Эти атрибуты можно использовать совместно с Model._meta API, чтобы проверять поля конкретного типа. Собственные поля модели должны определять эти атрибуты.
Атрибуты поля¶
- Field.auto_created¶
Флаг, который указывает было ли поле создано автоматически, например
OneToOneFieldпри наследовании моделей.
- Field.concrete¶
Флаг, который указывает представлено ли поле колонкой в таблице в базе данных.
Логический флаг, указывающий, скрыто ли поле и не должно ли оно возвращаться функцией
Options.get_fields()по умолчанию. Примером может служить обратное поле дляForeignKeyс `` linked_name``, начинающимся с'+'.
- Field.is_relation¶
Флаг, который указывает, ссылается ли поле на другие модели (например,
ForeignKey,ManyToManyField,OneToOneField, и т.д.).
- Field.model¶
Содержит модель, в которой это поле определено. Если поле определено в родительском классе,
modelбудет ссылаться на этот класс, а не класс экземпляра модели.
Атрибуты связывающих полей¶
Атрибуты, определяющие связь поля. Эти атрибуты присутствуют во всех полях, однако, только для связывающих полей(Field.is_relation=True) они содержат булевы значения(а не None).
- 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). Если поле содержит связь с несколькими объектами (такие какGenericForeignKeyилиGenericRelation) тогдаrelated_modelбудетNone.