Ссылка на поля модели
В этом документе содержатся все ссылки на 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. Если у поля, основанного на строке, есть null=True, это означает, что у него есть два возможных значения для «отсутствия данных»: NULL, и пустая строка. В большинстве случаев избыточно иметь два возможных значения для «отсутствия данных»; конвенция Django — использовать пустую строку, а не 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
Последовательность, состоящая из последовательностей ровно из двух элементов (например, [(A, B), (A, B) ...]), используемых в качестве вариантов для этого поля. Если варианты заданы, они применяются валидацией модели, и виджет формы по умолчанию будет выпадающим списком с этими вариантами, а не стандартным текстовым полем.
Первый элемент в каждой кортеже — фактическое значение, которое должно быть установлено в модели, а второй — имя, понятное пользователю. Например:
YEAR_IN_SCHOOL_CHOICES = [
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
]
В целом, лучше всего определять варианты внутри класса модели и назначать соответствующее имя для каждого значения:
from django.db import models
class Student(models.Model):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
YEAR_IN_SCHOOL_CHOICES = [
(FRESHMAN, 'Freshman'),
(SOPHOMORE, 'Sophomore'),
(JUNIOR, 'Junior'),
(SENIOR, 'Senior'),
]
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 в этом примере).
Для каждого поля модели, для которого установлен choices, Django добавит метод для получения имени, понятного пользователю, для текущего значения поля. См. get_FOO_display() в документации по API базы данных.
Обратите внимание, что варианты могут быть любым объектом последовательности — не обязательно списком или кортежем. Это позволяет создавать варианты динамически. Но если вы обнаружите, что «хакаете» choices для динамики, вам, вероятно, лучше использовать надлежащую таблицу базы данных с ForeignKey. choices предназначен для статических данных, которые редко или никогда не меняются.
Примечание
Каждый раз, когда меняется порядок choices , создается новая миграция.
Если у поля не установлен blank=False вместе с default, будет отображаться метка, содержащая "---------" вместе с выпадающим списком. Чтобы переопределить это поведение, добавьте кортеж в choices , содержащий None; например, (None, 'Your String For Display'). В качестве альтернативы можно использовать пустую строку вместо None там, где это уместно — например, в CharField.
db_column
-
Field.db_column
Имя столбца базы данных, используемого для этого поля. Если имя не задано, Django будет использовать имя поля.
Если имя столбца базы данных является SQL-зарезервированным словом или содержит символы, недопустимые в именах переменных Python — в частности, дефис — это допустимо. Django экранирует имена столбцов и таблиц за кулисами.
db_index
-
Field.db_index
Если True, для этого поля будет создан индекс базы данных.
db_tablespace
-
Field.db_tablespace
Имя пространства имен базы данных для использования для индекса этого поля, если это поле индексируется. Значение по умолчанию — настройка проекта DEFAULT_INDEX_TABLESPACE, если она установлена, или db_tablespace модели, если она указана. Если бэкенд не поддерживает пространства имен для индексов, этот параметр игнорируется.
default
-
Field.default
Значение по умолчанию для поля. Это может быть значение или вызываемый объект. Если вызываемый объект, он будет вызываться каждый раз при создании нового объекта.
Значение по умолчанию не может быть изменяемым объектом (экземпляр модели, list, set, и т.д.), так как ссылка на тот же экземпляр этого объекта будет использоваться в качестве значения по умолчанию для всех новых экземпляров модели. Вместо этого оберните желаемое значение по умолчанию в вызываемый объект. Например, если вы хотите указать значение по умолчанию dict для JSONField, используйте функцию:
def contact_default():
return {"email": "to1@example.com"}
contact_info = JSONField("ContactInfo", default=contact_default)
lambda не могут использоваться для параметров полей, таких как default, потому что они не могут быть сериализованы миграциями. См. документацию по другим замечаниям.
Для полей, таких как ForeignKey, которые отображают экземпляры модели, значения по умолчанию должны быть значениями связанного поля (pk если to_field не задан) вместо самих экземпляров модели.
Значение по умолчанию используется при создании новых экземпляров модели, если для поля не указано иное значение. Когда поле является первичным ключом, значение по умолчанию также используется, когда поле установлено в None.
editable
-
Field.editable
Если False, поле не будет отображаться в админ-панели или любом другом ModelForm. Они также пропускаются во время валидации модели. Значение по умолчанию True.
error_messages
-
Field.error_messages
Аргумент error_messages позволяет переопределить стандартные сообщения об ошибках, которые может генерировать поле. Передайте словарь с ключами, соответствующими сообщениям об ошибках, которые вы хотите переопределить.
Ключи сообщений об ошибках включают null, blank, invalid, invalid_choice, unique, и unique_for_date. Дополнительные ключи сообщений об ошибках указаны для каждого поля в разделе Типы полей ниже.
Эти сообщения об ошибках часто не распространяются на формы. См. Рекомендации по использованию model's error_messages.
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. Убедитесь, что вы экранируете любой текст помощи, который может исходить от ненадежных пользователей, чтобы избежать межсайтовых сценариев.
primary_key
-
Field.primary_key
Если True, это поле является первичным ключом для модели.
Если вы не указываете primary_key=True для любого поля в вашей модели, Django автоматически добавит AutoField для хранения первичного ключа, поэтому вам не нужно устанавливать primary_key=True ни на одно из ваших полей, если вы не хотите переопределить поведение первичного ключа по умолчанию. Дополнительная информация в Автоматические поля первичного ключа.
primary_key=True подразумевает null=False и unique=True. Только одно поле первичного ключа разрешено на объект.
Поле первичного ключа является только для чтения. Если вы измените значение первичного ключа на существующем объекте и затем сохраните его, будет создан новый объект наряду со старым.
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
Список валидаторов, которые нужно выполнить для этого поля. Дополнительная информация в документации по валидаторам.
Регистрация и получение запросов
Field реализует API регистрации запросов. API можно использовать для настройки доступных запросов для класса поля и того, как запросы извлекаются из поля.
Типы полей модели
AutoField
-
class AutoField(**options)[source]
Поле IntegerField, которое автоматически увеличивает значение в соответствии с доступными идентификаторами. Обычно вам не нужно использовать его напрямую; поле первичного ключа будет автоматически добавлено в вашу модель, если вы не укажете другое. См. Автоматические поля первичного ключа.
BigAutoField
-
class BigAutoField(**options)[source]
Целое 64-битное число, подобно AutoField, за исключением того, что оно гарантированно вмещает числа от 1 до 9223372036854775807.
BigIntegerField
-
class BigIntegerField(**options)[source]
Целое 64-битное число, подобно IntegerField, за исключением того, что оно гарантированно вмещает числа от -9223372036854775808 до 9223372036854775807. По умолчанию виджет формы для этого поля — TextInput.
BinaryField
-
class BinaryField(max_length=None, **options)[source]
Поле для хранения необработанных двоичных данных. Ему можно присвоить bytes, bytearray или memoryview.
По умолчанию, BinaryField устанавливает editable в False, в таком случае его нельзя включить в ModelForm.
В более старых версиях нельзя установить editable в True.
BinaryField имеет один дополнительный необязательный аргумент:
-
BinaryField.max_length -
Максимальная длина (в символах) поля. Максимальная длина проверяется в Django с помощью
MaxLengthValidator.
Использование BinaryField
Хотя вы можете подумать о хранении файлов в базе данных, имейте в виду, что это плохой дизайн в 99% случаев. Это поле не заменяет надлежащую обработку статических файлов.
BooleanField
-
class BooleanField(**options)[source]
Поле «истина/ложь».
По умолчанию виджет формы для этого поля — CheckboxInput или NullBooleanSelect, если null=True.
Значение по умолчанию для BooleanField равно None если Field.default не определено.
В более старых версиях это поле не допускает null=True, поэтому нужно использовать NullBooleanField вместо него. Использование последнего теперь не рекомендуется, так как его, вероятно, устареют в будущей версии Django.
В более старых версиях это поле имеет blank=True неявно. Вы можете восстановить предыдущее поведение, установив blank=True.
CharField
-
class CharField(max_length=None, **options)[source]
Строковое поле для строк малого и большого размера.
Для больших объёмов текста используйте TextField.
По умолчанию виджет формы для этого поля — TextInput.
CharField имеет один дополнительный обязательный аргумент:
-
CharField.max_length -
Максимальная длина (в символах) поля. max_length проверяется на уровне базы данных и в валидации Django с помощью
MaxLengthValidator.
Примечание
Если вы пишете приложение, которое должно быть портируемым на несколько баз данных, вам следует знать, что для некоторых баз данных существуют ограничения на max_length . Подробности см. в примечаниях к базе данных.
DateField
-
class DateField(auto_now=False, auto_now_add=False, **options)[source]
Дата, представленная в 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()
- Для
По умолчанию виджет формы для этого поля — TextInput. Админ добавляет календарь 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 и принятия решения о том, как обрабатывать преобразование из datetime в date во время отображения.
DateTimeField
-
class DateTimeField(auto_now=False, auto_now_add=False, **options)[source]
Дата и время, представленные в Python экземпляром datetime.datetime . Принимает те же дополнительные аргументы, что и DateField.
По умолчанию виджет формы для этого поля представляет собой одиночный TextInput. В админ-панели используются два отдельных TextInput виджета с JavaScript-сокращениями.
DecimalField
-
class DecimalField(max_digits=None, decimal_places=None, **options)[source]
Десятичное число с фиксированной точностью, представленное в Python объектом Decimal. Ввод проверяется с помощью DecimalValidator.
Требует два обязательных аргумента:
-
DecimalField.max_digits -
Максимальное количество цифр, разрешенных в числе. Обратите внимание, что это число должно быть больше или равно
decimal_places.
-
DecimalField.decimal_places -
Количество десятичных знаков для хранения числа.
Например, для хранения чисел до 999 с точностью до 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. Также следует учитывать ограничения SQLite для десятичных полей.
DurationField
-
class DurationField(**options)[source]
Поле для хранения промежутков времени, моделируемое в Python объектом timedelta. При использовании с PostgreSQL используется тип данных interval, а с Oracle — INTERVAL DAY(9) TO
SECOND(6). В остальных случаях используется bigint микросекунд.
Примечание
Арифметические операции с DurationField работают в большинстве случаев. Однако на всех базах данных, кроме PostgreSQL, сравнение значения DurationField с арифметическими операциями над объектами DateTimeField не будет работать должным образом.
EmailField
-
class EmailField(max_length=254, **options)[source]
CharField, который проверяет, является ли значение корректным адресом электронной почты, используя EmailValidator.
FileField
-
class FileField(upload_to=None, max_length=100, **options)[source]
Поле для загрузки файлов.
Примечание
Аргумент primary_key не поддерживается и вызовет ошибку при использовании.
Имеет два необязательных аргумента:
-
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 (с косыми чертами), который будет передан системе хранения.Аргумент Описание 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). Вероятно, вам захочется использовать удобный атрибутurl, предоставляемый Django. Например, если ваше поле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[source]
При обращении к 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.size
Результат метода базового Storage.size().
-
FieldFile.url
Только для чтения свойство для доступа к относительному URL файла путем вызова метода url() базового класса Storage.
-
FieldFile.open(mode='rb')[source]
Открывает или повторно открывает файл, связанный с этим экземпляром, в указанном mode. В отличие от стандартного метода Python open(), он не возвращает дескриптор файла.
Поскольку базовый файл открывается неявно при доступе к нему, вызов этого метода может быть необязательным, за исключением случаев сброса указателя на базовый файл или изменения mode.
-
FieldFile.close()[source]
Ведет себя как стандартный метод Python file.close() и закрывает файл, связанный с этим экземпляром.
-
FieldFile.save(name, content, save=True)[source]
Этот метод принимает имя файла и содержимое файла и передает их классу хранилища для поля, затем связывает сохраненный файл с полем модели. Если вы хотите вручную связать данные файла с 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)[source]
Удаляет файл, связанный с этим экземпляром, и очищает все атрибуты поля. Примечание: этот метод закроет файл, если он будет открыт при вызове delete().
Необязательный аргумент save управляет тем, сохраняется ли экземпляр модели после удаления файла, связанного с этим полем. По умолчанию True.
Обратите внимание, что при удалении модели связанные файлы не удаляются. Если вам нужно очистить оставшиеся файлы, вам нужно будет сделать это самостоятельно (например, с помощью пользовательской команды управления, которая может запускаться вручную или планироваться для периодического запуска через cron).
FilePathField
-
class FilePathField(path=None, match=None, recursive=False, max_length=100, **options)[source]
A CharField whose choices are limited to the filenames in a certain directory on the filesystem. Has three special arguments, of which the first is required:
-
FilePathField.path -
Обязательно. Абсолютный путь к каталогу в файловой системе, из которого это
FilePathFieldдолжно получать свои варианты. Пример:"/home/images".
-
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)[source]
Число с плавающей точкой, представленное в Python объектом типа float.
Поле по умолчанию для этого поля — NumberInput, если localize равно False, в противном случае — TextInput.
FloatField vs. DecimalField
Класс FloatField иногда путают с классом DecimalField. Хотя оба они представляют вещественные числа, они представляют их по-разному. FloatField использует внутренний тип Python float, а DecimalField использует внутренний тип Python Decimal. Подробнее о различиях см. в документации Python для модуля decimal.
ImageField
-
class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)[source]
Наследует все атрибуты и методы от FileField, но также проверяет, является ли загруженный объект допустимым изображением.
В дополнение к специальным атрибутам, доступным для FileField, у ImageField также есть атрибуты height и width.
Для облегчения запросов по этим атрибутам, у ImageField есть два дополнительных необязательных аргумента:
-
ImageField.height_field -
Имя поля модели, которое будет автоматически заполняться высотой изображения каждый раз при сохранении экземпляра модели.
-
ImageField.width_field -
Имя поля модели, которое будет автоматически заполняться шириной изображения каждый раз при сохранении экземпляра модели.
Требуется библиотека Pillow.
ImageField объекты создаются в вашей базе данных как столбцы varchar с максимальной длиной по умолчанию 100 символов. Как и в других полях, вы можете изменить максимальную длину, используя аргумент max_length.
Поле по умолчанию для этого поля — ClearableFileInput.
IntegerField
-
class IntegerField(**options)[source]
Целое число. Значения от -2147483648 до 2147483647 безопасны во всех базах данных, поддерживаемых Django.
Использует MinValueValidator и MaxValueValidator для проверки ввода на основе значений, поддерживаемых базой данных по умолчанию.
Поле по умолчанию для этого поля — NumberInput, если localize равно False, в противном случае — TextInput.
GenericIPAddressField
-
class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)[source]
Адрес IPv4 или IPv6 в строковом формате (например, 192.0.2.30 или 2a02:42fe::4). Поле по умолчанию для этого поля — TextInput.
Нормализация адресов IPv6 следует разделу 2.2 RFC 4291#section-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, отображенные в виде
::ffff:192.0.2.1. При включении этого параметра адрес будет распакован в192.0.2.1. По умолчанию выключено. Может использоваться только приprotocolустановлено в'both'.
Если вы разрешаете пустые значения, вам необходимо разрешить нулевые значения, поскольку пустые значения хранятся как нулевые.
NullBooleanField
-
class NullBooleanField(**options)[source]
Как BooleanField с null=True. Используйте его вместо этого поля, так как оно, вероятно, будет устаревшим в будущих версиях Django.
PositiveIntegerField
-
class PositiveIntegerField(**options)[source]
Как IntegerField, но должен быть либо положительным, либо нулевым (0). Значения от 0 до 2147483647 безопасны во всех базах данных, поддерживаемых Django. Значение 0 принимается для обратной совместимости.
PositiveSmallIntegerField
-
class PositiveSmallIntegerField(**options)[source]
Как PositiveIntegerField, но допускает только значения меньше определённой (зависимой от базы данных) точки. Значения от 0 до 32767 безопасны во всех базах данных, поддерживаемых Django.
SlugField
-
class SlugField(max_length=50, **options)[source]
Слаг — термин из журналистики. Слаг — это краткое обозначение чего-либо, содержащее только буквы, цифры, символы нижнего подчеркивания или дефисы. Они обычно используются в 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.
SmallIntegerField
-
class SmallIntegerField(**options)[source]
Как IntegerField, но допускает только значения меньше определённой (зависимой от базы данных) точки. Значения от -32768 до 32767 безопасны во всех базах данных, поддерживаемых Django.
TextField
-
class TextField(**options)[source]
Поле для большого текста. По умолчанию виджет формы для этого поля — Textarea.
Если вы укажете атрибут max_length, он будет отражён в виджете Textarea автоматически сгенерированного поля формы. Однако он не проверяется на уровне модели или базы данных. Для этого используйте CharField.
TimeField
-
class TimeField(auto_now=False, auto_now_add=False, **options)[source]
Время, представленное в Python экземпляром datetime.time. Допускает те же параметры автозаполнения, что и DateField.
По умолчанию виджет формы для этого поля — TextInput. Админка добавляет некоторые JavaScript-сокращения.
URLField
-
class URLField(max_length=200, **options)[source]
CharField для URL, валидируемый с помощью URLValidator.
По умолчанию виджет формы для этого поля — TextInput.
Как и все подклассы CharField, URLField принимает необязательный аргумент max_length. Если вы не укажете max_length, будет использовано значение по умолчанию 200.
UUIDField
-
class UUIDField(**options)[source]
Поле для хранения универсальных уникальных идентификаторов. Использует класс Python UUID. При использовании с PostgreSQL хранится в типе данных 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
Использование iexact, contains, icontains, startswith, istartswith, endswith или iendswith запросы с PostgreSQL не работают для значений без дефисов, потому что PostgreSQL хранит их в типе данных uuid с дефисами.
Связанные поля
ForeignKey
-
class ForeignKey(to, on_delete, **options)[source]
Связь «многие-к-одному». Требует двух позиционных аргументов: класс, к которому относится модель, и опцию on_delete.
Чтобы создать рекурсивную связь — объект, имеющий связь «многие-к-одному» с самим собой — используйте models.ForeignKey('self',
on_delete=models.CASCADE).
Если вам нужно создать связь с моделью, которая ещё не определена, вы можете использовать имя модели вместо объекта модели:
from django.db import models
class Car(models.Model):
manufacturer = models.ForeignKey(
'Manufacturer',
on_delete=models.CASCADE,
)
# ...
class Manufacturer(models.Model):
# ...
pass
END_OF_DOCUMENT_MARKER Определяемые таким образом отношения на абстрактных моделях разрешаются при создании подкласса модели в качестве конкретной модели и не относятся к абстрактной модели app_label:
from django.db import models
class AbstractCar(models.Model):
manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE)
class Meta:
abstract = True
from django.db import models
from products.models import AbstractCar
class Manufacturer(models.Model):
pass
class Car(AbstractCar):
pass
# Car.manufacturer will point to `production.Manufacturer` here.
Чтобы обратиться к моделям, определённым в другом приложении, вы можете явно указать модель с полным именем приложения. Например, если модель Manufacturer выше определена в другом приложении с именем production, вам потребуется использовать:
class Car(models.Model):
manufacturer = models.ForeignKey(
'production.Manufacturer',
on_delete=models.CASCADE,
)
Такой тип ссылки, называемый ленивым отношением, может быть полезен при разрешении циклических зависимостей импорта между двумя приложениями.
Индекс базы данных автоматически создаётся для ForeignKey. Вы можете отключить это, установив db_index в значение False. Возможно, вам стоит избежать издержек индекса, если вы создаёте внешний ключ для обеспечения согласованности, а не для объединений, или если вы будете создавать альтернативный индекс, например, частичный или индекс по нескольким столбцам.
Представление в базе данных
За кулисами Django добавляет "_id" к имени поля для создания имени столбца в базе данных. В приведённом выше примере таблица базы данных для модели Car будет иметь столбец manufacturer_id. (Вы можете явно изменить это, указав db_column) Однако в вашем коде вам никогда не придётся иметь дело с именем столбца базы данных, если только вы не пишете собственный SQL. Вы всегда будете работать с именами полей вашего объекта модели.
Аргументы
ForeignKey принимает другие аргументы, определяющие детали работы отношения.
-
ForeignKey.on_delete -
Когда объект, на который ссылается
ForeignKey, удаляется, Django будет имитировать поведение SQL-ограничения, указанного аргументомon_delete. Например, если у вас есть допускающий NULLForeignKey, и вы хотите установить его в значение null при удалении связанного объекта:user = models.ForeignKey( User, models.SET_NULL, blank=True, null=True, )on_deleteне создаёт SQL-ограничение в базе данных. Поддержка вариантов каскадного удаления на уровне базы данных может быть реализована позже.
Возможные значения для on_delete находятся в django.db.models:
-
-
CASCADE[source] -
Каскадное удаление. Django имитирует поведение SQL-ограничения ON DELETE CASCADE и также удаляет объект, содержащий ForeignKey.
Model.delete()не вызывается для связанных моделей, но сигналыpre_deleteиpost_deleteотправляются для всех удаляемых объектов.
-
-
-
PROTECT[source] -
Предотвращает удаление связанного объекта, вызывая исключение
ProtectedError, являющееся подклассомdjango.db.IntegrityError.
-
-
-
SET_NULL[source] -
Устанавливает
ForeignKeyв значение null; это возможно только еслиnullравноTrue.
-
-
-
SET_DEFAULT[source] -
Устанавливает
ForeignKeyв его значение по умолчанию; дляForeignKeyдолжно быть установлено значение по умолчанию.
-
-
-
SET()[source] -
Устанавливает
ForeignKeyв значение, переданное вSET(), или, если передан вызываемый объект, в результат его вызова. В большинстве случаев для предотвращения выполнения запросов при импорте ваших моделей.py необходимо передавать вызываемый объект:from django.conf import settings from django.contrib.auth import get_user_model from django.db import models def get_sentinel_user(): return get_user_model().objects.get_or_create(username='deleted')[0] class MyModel(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET(get_sentinel_user), )
-
-
-
DO_NOTHING[source] -
Не предпринимать никаких действий. Если ваш поставщик базы данных навязывает целостность ссылок, это приведёт к
IntegrityError, если вы не добавите вручную SQLON DELETE-ограничение к полю базы данных.
-
-
ForeignKey.limit_choices_to -
Ограничивает доступные варианты для этого поля при отображении этого поля с помощью
ModelFormили админского интерфейса (по умолчанию доступны все объекты в наборе запросов). Для этого можно использовать словарь, объектQили вызываемый объект, возвращающий словарь или объектQ.Например:
staff_member = models.ForeignKey( User, on_delete=models.CASCADE, limit_choices_to={'is_staff': True}, )приводит к тому, что соответствующее поле в
ModelFormотображает толькоUsersсis_staff=True. Это может быть полезно в админском интерфейсе Django.Вызываемый объект может быть полезен, например, при использовании совместно с модулем Python
datetimeдля ограничения выбора диапазоном дат. Например:def limit_pub_date_choices(): return {'pub_date__lte': datetime.date.utcnow()} limit_choices_to = limit_pub_date_choicesЕсли
limit_choices_toявляется или возвращаетQ object, что полезно для сложных запросов, то он повлияет только на доступные варианты в админском интерфейсе, если поле не указано вraw_id_fieldsвModelAdminдля модели.Примечание
Если для
limit_choices_toиспользуется вызываемый объект, он будет вызываться каждый раз при создании новой формы. Он также может вызываться при валидации модели, например, при выполнении команд управления или в админском интерфейсе. Админский интерфейс строит наборы запросов для проверки вводимых данных формы в различных крайних случаях несколько раз, поэтому существует вероятность, что ваш вызываемый объект будет вызван несколько раз.
-
Используемое имя для отношения от связанного объекта обратно к этому объекту. Это также значение по умолчанию для
related_query_name(используемое имя для обратного фильтра по имени от целевой модели). Подробное объяснение и пример см. в документации по связанным объектам. Обратите внимание, что вы должны установить это значение при определении отношений на абстрактных моделях; при этом доступна некоторая специальная синтаксическая конструкция.Если вы предпочитаете, чтобы Django не создавал обратное отношение, установите
related_nameв'+'или закончите его'+'. Например, это гарантирует, что модельUserне будет иметь обратного отношения к данной модели:user = models.ForeignKey( User, on_delete=models.CASCADE, related_name='+', )
-
Имя, используемое для обратного фильтра из целевой модели. По умолчанию оно равно значению
related_nameилиdefault_related_name, если задано, иначе — имени модели:# Declare the ForeignKey with related_query_name class Tag(models.Model): article = models.ForeignKey( Article, on_delete=models.CASCADE, related_name="tags", related_query_name="tag", ) name = models.CharField(max_length=255) # That's now the name of the reverse filter Article.objects.filter(tag__name="important")Как и
related_name,related_query_nameподдерживает интерполяцию имени приложения и класса через специальный синтаксис.
-
ForeignKey.to_field -
Поле в связанном объекте, к которому относится отношение. По умолчанию Django использует первичный ключ связанного объекта. Если вы ссылаетесь на другое поле, это поле должно иметь
unique=True.
-
ForeignKey.db_constraint -
Управляет созданием ограничения в базе данных для этого внешнего ключа. По умолчанию
True, и это, скорее всего, то, что вам нужно; установка этого значения вFalseможет нанести большой вред целостности данных. Тем не менее, вот некоторые сценарии, где вам может потребоваться это сделать:- У вас есть устаревшие данные, которые недействительны.
- Вы фрагментируете свою базу данных.
Если это значение установлено в
False, доступ к связанному объекту, которого не существует, вызовет исключениеDoesNotExist.
-
ForeignKey.swappable -
Управляет реакцией механизма миграций, если этот
ForeignKeyуказывает на взаимозаменяемую модель. Если это значениеTrue— по умолчанию — и еслиForeignKeyуказывает на модель, соответствующую текущему значениюsettings.AUTH_USER_MODEL(или другому значению взаимозаменяемой модели), то отношение будет сохранено в миграции с ссылкой на это значение, а не на модель напрямую.Вы хотите переопределить это значение на
Falseтолько в том случае, если вы уверены, что ваша модель всегда должна указывать на подставленную модель — например, если это модель профиля, специально разработанная для вашей пользовательской модели.Установка значения в
Falseне означает, что вы можете ссылаться на взаимозаменяемую модель, даже если она заменена —Falseпросто означает, что миграции, созданные с этим внешним ключом, всегда будут ссылаться на указанную вами точную модель (что приведет к ошибке, если пользователь попытается запустить с моделью пользователя, которую вы не поддерживаете, например).В случае сомнений оставьте значение по умолчанию
True.
ManyToManyField
-
class ManyToManyField(to, **options)[source]
Связь «многие ко многим». Требует позиционного аргумента: класс, с которым связана модель, который работает точно так же, как и для ForeignKey, включая рекурсивные и ленивые отношения.
Связанные объекты можно добавлять, удалять или создавать с помощью RelatedManager поля.
Представление в базе данных
За кулисами Django создает промежуточную таблицу соединения для представления отношения «многие ко многим». По умолчанию имя этой таблицы генерируется с использованием имени поля «многие ко многим» и имени таблицы для модели, которая его содержит. Поскольку некоторые базы данных не поддерживают имена таблиц определенной длины, эти имена таблиц будут автоматически усечены, и будет использоваться хеш уникальности, например author_books_9cdf. Вы можете вручную указать имя таблицы соединения с помощью опции db_table.
Аргументы
ManyToManyField принимает дополнительные наборы аргументов — все необязательные — которые управляют тем, как работает отношение.
-
То же, что и
ForeignKey.related_name.
-
То же, что и
ForeignKey.related_query_name.
-
ManyToManyField.limit_choices_to -
То же, что и
ForeignKey.limit_choices_to.limit_choices_toне имеет эффекта, когда используется сManyToManyFieldс указанной вручную промежуточной таблицей с помощью параметраthrough.
-
ManyToManyField.symmetrical -
Используется только при определении ManyToManyField на себе. Рассмотрим следующую модель:
from django.db import models class Person(models.Model): friends = models.ManyToManyField("self")Когда Django обрабатывает эту модель, он определяет, что у неё есть
ManyToManyFieldна себе, и в результате он не добавляет атрибутperson_setк классуPerson. Вместо этого, предполагается, чтоManyToManyFieldсимметрична — то есть, если я твой друг, то ты мой друг.Если вам не нужна симметрия в отношениях «многие ко многим» с
self, установитеsymmetricalв значениеFalse. Это заставит Django добавить дескриптор для обратного отношения, позволяя отношениямManyToManyFieldбыть несимметричными.
-
ManyToManyField.through -
Django автоматически создаст таблицу для управления отношениями «многие ко многим». Однако, если вы хотите вручную указать промежуточную таблицу, вы можете использовать опцию
throughдля указания Django-модели, представляющей промежуточную таблицу, которую вы хотите использовать.Наиболее распространенное использование этой опции — когда вы хотите связать дополнительные данные с отношением «многие ко многим».
Если вы не указываете явную модель
through, всё равно существует неявная модельthrough, которую можно использовать для прямого доступа к таблице, созданной для хранения ассоциаций. Она имеет три поля для связи моделей.Если модели источник и целевая отличаются, генерируются следующие поля:
-
id: первичный ключ отношения. -
<containing_model>_id:idмодели, которая объявляетManyToManyField. -
<other_model>_id:idмодели, к которойManyToManyFieldуказывает.
Если
ManyToManyFieldуказывает от и к одной и той же модели, генерируются следующие поля:-
id: первичный ключ отношения. -
from_<model>_id:idэкземпляра, указывающего на модель (т.е. исходного экземпляра). -
to_<model>_id:idэкземпляра, к которому указывает отношение (т.е. целевого экземпляра модели).
Этот класс можно использовать для запроса связанных записей для данного экземпляра модели, как обычную модель.
-
-
ManyToManyField.through_fields -
Используется только при указании пользовательской промежуточной модели. Django обычно автоматически определяет поля промежуточной модели, необходимые для установления связи «многие ко многим». Однако рассмотрите следующие модели:
from django.db import models class Person(models.Model): name = models.CharField(max_length=50) class Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField( Person, through='Membership', through_fields=('group', 'person'), ) class Membership(models.Model): group = models.ForeignKey(Group, on_delete=models.CASCADE) person = models.ForeignKey(Person, on_delete=models.CASCADE) inviter = models.ForeignKey( Person, on_delete=models.CASCADE, related_name="membership_invites", ) invite_reason = models.CharField(max_length=64)Membershipсодержит два внешних ключа кPerson(personиinviter), что делает связь неоднозначной, и Django не может определить, какой из них использовать. В этом случае необходимо явно указать внешние ключи, которые Django должен использовать, используяthrough_fields, как в примере выше.through_fieldsпринимает 2-кортеж('field1', 'field2'), гдеfield1— имя внешнего ключа к модели, на которой определенManyToManyField(в данном случаеgroup), аfield2— имя внешнего ключа к целевой модели (в данном случаеperson).Если в промежуточной модели присутствует более одного внешнего ключа к любой (или обеим) из моделей, участвующих в связи «многие ко многим», необходимо обязательно указать
through_fields. Это также относится к взаимосвязям с рекурсией, когда используется промежуточная модель и имеется более двух внешних ключей к модели, или если вы хотите явно указать, какие два использовать Django.Взаимосвязи с рекурсией, использующие промежуточную модель, всегда определяются как несимметричные — то есть с
symmetrical=False— поэтому существует понятие «источника» и «цели». В этом случае'field1'будет рассматриваться как «источник» связи, а'field2'как «цель».
-
ManyToManyField.db_table -
Имя таблицы для хранения данных связи «многие ко многим». Если этот параметр не указан, Django использует имя по умолчанию, основанное на именах: таблицы модели, определяющей связь, и имени самого поля.
-
ManyToManyField.db_constraint -
Управляет тем, будут ли созданы ограничения в базе данных для внешних ключей в промежуточной таблице. Значение по умолчанию —
True, и это, скорее всего, то, что вам нужно; установка этого значения вFalseможет очень негативно сказаться на целостности данных. Тем не менее, есть некоторые сценарии, в которых вы можете это сделать:- У вас есть устаревшие данные, которые не соответствуют требованиям.
- Вы используете фрагментацию вашей базы данных.
Ошибка возникает при передаче как
db_constraint, так иthrough.
-
ManyToManyField.swappable -
Управляет реакцией механизма миграций, если этот
ManyToManyFieldуказывает на заменяемую модель. Если это значениеTrue(значение по умолчанию), то еслиManyToManyFieldуказывает на модель, соответствующую текущему значениюsettings.AUTH_USER_MODEL(или другому параметру заменяемой модели), связь будет сохранена в миграции с использованием ссылки на параметр, а не на модель напрямую.Вы хотите изменить это значение на
Falseтолько если уверены, что ваша модель всегда должна указывать на заменённую модель — например, если это модель профиля, предназначенная специально для вашей пользовательской модели.Если сомневаетесь, оставьте значение по умолчанию
True.
ManyToManyField не поддерживает validators.
null не оказывает влияния, так как нет способа потребовать связи на уровне базы данных.
OneToOneField
-
class OneToOneField(to, on_delete, parent_link=False, **options)[source]
Связь «один к одному». По концепции это похоже на ForeignKey с unique=True, но обратная сторона связи будет напрямую возвращать единственный объект.
Это наиболее полезно в качестве первичного ключа модели, которая «расширяет» другую модель каким-либо образом; Наследование с несколькими таблицами реализуется путём добавления неявной связи «один к одному» от дочерней модели к родительской модели, например.
Требуется один позиционный аргумент: класс, с которым будет связана модель. Это работает точно так же, как и для ForeignKey, включая все параметры, связанные с рекурсивными и ленивыми связями.
Если не указать аргумент related_name для OneToOneField, Django будет использовать имя текущей модели в нижнем регистре в качестве значения по умолчанию.
В следующем примере:
from django.conf import settings
from django.db import models
class MySpecialUser(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
supervisor = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='supervisor_of',
)
полученная User модель будет иметь следующие атрибуты:
>>> user = User.objects.get(pk=1) >>> hasattr(user, 'myspecialuser') True >>> hasattr(user, 'supervisor_of') True
Исключение DoesNotExist возникает при обращении к обратной связи, если запись в связанной таблице не существует. Например, если у пользователя нет руководителя, назначенного с помощью MySpecialUser:
>>> user.supervisor_of
Traceback (most recent call last):
...
DoesNotExist: User matching query does not exist.
Кроме того, OneToOneField принимает все дополнительные аргументы, принимаемые ForeignKey, плюс один дополнительный аргумент:
-
OneToOneField.parent_link -
Когда
Trueиспользуется в модели, которая наследуется от другой конкретной модели, указывает, что это поле должно использоваться в качестве ссылки обратно к родительскому классу, а не к дополнительнойOneToOneField, которая обычно создаётся неявно при наследовании.
См. Примеры связей «один к одному» для примеров использования OneToOneField.
Справочник по API полей
-
class Field[source] -
Fieldявляется абстрактным классом, представляющим столбец таблицы базы данных. Django использует поля для создания таблицы базы данных (db_type()), для сопоставления типов Python с базой данных (get_prep_value()) и наоборот (from_db_value()).Таким образом, поле является фундаментальной частью различных API Django, в частности,
modelsиquerysets.В моделях поле инициализируется как атрибут класса и представляет собой конкретный столбец таблицы, см. Модели. Оно имеет атрибуты, такие как
nullиunique, и методы, которые Django использует для сопоставления значения поля с значениями, специфичными для базы данных.Поле является подклассом
RegisterLookupMixinи, следовательно, на нем можно зарегистрировать какTransform, так иLookup, для использования вQuerySet(например,field_name__exact="foo"). Все встроенные поиск по полям регистрируются по умолчанию.Все встроенные поля Django, такие как
CharField, представляют собой конкретные реализацииField. Если вам нужно пользовательское поле, вы можете либо унаследовать от любого из встроенных полей, либо написатьFieldс нуля. В любом случае, см. Создание пользовательских полей моделей.-
description -
Подробное описание поля, например, для приложения
django.contrib.admindocs.Описание может быть в виде:
description = _("String (up to %(max_length)s)")где аргументы интерполируются из
__dict__поля.
Для сопоставления
Fieldсо специфичным для базы данных типом Django предоставляет несколько методов:-
get_internal_type()[source] -
Возвращает строку с именем этого поля для целей, специфичных для бэкенда. По умолчанию возвращает имя класса.
См. Эмуляция встроенных типов полей для использования в пользовательских полях.
-
db_type(connection)[source] -
Возвращает тип данных столбца базы данных для
Field, с учетомconnection.См. Пользовательские типы базы данных для использования в пользовательских полях.
-
rel_db_type(connection)[source] -
Возвращает тип данных столбца базы данных для полей, таких как
ForeignKeyиOneToOneField, которые указывают наField, с учетомconnection.См. Пользовательские типы базы данных для использования в пользовательских полях.
Существует три основных ситуации, когда Django необходимо взаимодействовать с базой данных и полями:
- когда он выполняет запрос к базе данных (значение Python -> значение бэкенда базы данных)
- когда он загружает данные из базы данных (значение бэкенда базы данных -> значение Python)
- когда он сохраняет данные в базе данных (значение Python -> значение бэкенда базы данных)
При запросе используются
get_db_prep_value()иget_prep_value():-
get_prep_value(value)[source] -
value— текущее значение атрибута модели, и метод должен вернуть данные в формате, подготовленном для использования в качестве параметра в запросе.См. Преобразование объектов Python в значения запросов для использования.
-
get_db_prep_value(value, connection, prepared=False)[source] -
Преобразует
valueв значение, специфичное для бэкенда. По умолчанию возвращаетvalue, еслиprepared=True, иget_prep_value(), еслиFalse.См. Преобразование значений запроса в значения базы данных для использования.
При загрузке данных используется
from_db_value():-
from_db_value(value, expression, connection) -
Преобразует значение, возвращенное базой данных, в объект Python. Это обратное преобразование для
get_prep_value().Этот метод не используется для большинства встроенных полей, так как база данных уже возвращает правильный тип Python, или сама база данных выполняет преобразование.
См. Преобразование значений в объекты Python для использования.
Примечание
Из соображений производительности,
from_db_valueне реализуется как no-op для полей, которые не требуют этого (все поля Django). Следовательно, вы не можете вызватьsuperв своем определении.
При сохранении используются
pre_save()иget_db_prep_save():-
get_db_prep_save(value, connection)[source] -
Аналогично
get_db_prep_value(), но вызывается, когда значение поля должно быть сохранено в базе данных. По умолчанию возвращаетget_db_prep_value().
-
pre_save(model_instance, add)[source] -
Метод, вызываемый перед
get_db_prep_save(), для подготовки значения перед сохранением (например, дляDateField.auto_now).model_instance— это экземпляр, к которому принадлежит это поле, аadd— это то, сохраняется ли экземпляр в базе данных впервые.Он должен возвращать значение соответствующего атрибута из
model_instanceдля этого поля. Имя атрибута находится вself.attname(это задаетсяField).См. Предварительная обработка значений перед сохранением для использования.
Поля часто получают свои значения в качестве другого типа, либо из сериализации, либо из форм.
-
-
to_python(value)[source] -
Преобразует значение в соответствующий объект Python. Он действует как обратная функция
value_to_string()и также вызывается вclean().См. Преобразование значений в объекты Python для использования.
Помимо сохранения в базе данных, поле также должно знать, как сериализовать своё значение:
-
value_from_object(obj)[source] -
Возвращает значение поля для данного экземпляра модели.
Этот метод часто используется
value_to_string().
-
value_to_string(obj)[source] -
Преобразует
objв строку. Используется для сериализации значения поля.См. Преобразование данных поля модели для сериализации для использования.
При использовании
model forms,Fieldнужно знать, какое поле формы оно должно представлять:-
formfield(form_class=None, choices_form_class=None, **kwargs)[source] -
Возвращает по умолчанию
django.forms.Fieldэтого поля дляModelForm.По умолчанию, если оба
form_classиchoices_form_classравныNone, используетсяCharField. Если поле имеетchoices, иchoices_form_classне указано, используетсяTypedChoiceField.См. Указание поля формы для поля модели для использования.
-
deconstruct()[source] -
Возвращает 4-кортеж с достаточной информацией для повторного создания поля:
- Имя поля в модели.
- Путь импорта поля (например,
"django.db.models.IntegerField"). Это должно быть наиболее переносимое представление, поэтому менее специфическое может быть лучше. - Список позиционных аргументов.
- Словарь аргументов ключевых слов.
Этот метод должен быть добавлен к полям до версии 1.7, чтобы мигрировать его данные с помощью Миграций.
-
Справочник по атрибутам поля
Каждый экземпляр Field содержит несколько атрибутов, которые позволяют инспектировать его поведение. Используйте эти атрибуты вместо проверок isinstance при написании кода, зависящего от функциональности поля. Эти атрибуты можно использовать совместно с API модели _meta для сужения поиска конкретных типов полей. Пользовательские поля модели должны реализовывать эти флаги.
Атрибуты для полей
-
Field.auto_created -
Флаг булевого типа, указывающий, было ли поле автоматически создано, например,
OneToOneField, используемый наследованием моделей.
-
Field.concrete -
Флаг булевого типа, указывающий, есть ли у поля связанный с ним столбец в базе данных.
-
Флаг булевого типа, указывающий, используется ли поле для поддержки функциональности другого поля без скрытия (например, поля
content_typeиobject_id, составляющиеGenericForeignKey). Флагhiddenиспользуется для различения того, что составляет публичный подмножество полей в модели от всех полей в модели.Примечание
Options.get_fields()по умолчанию исключает скрытые поля. Передайтеinclude_hidden=True, чтобы вернуть скрытые поля в результатах.
-
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/2.2/ref/models/fields/