Spec-Zone.ru › Django 3.0

Справочник по полям модели

В этом документе содержатся все ссылки на 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'),
    ('GR', 'Graduate'),
]

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

from django.db import models

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    GRADUATE = 'GR'
    YEAR_IN_SCHOOL_CHOICES = [
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
        (GRADUATE, 'Graduate'),
    ]
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in {self.JUNIOR, self.SENIOR}

Хотя вы можете определить список вариантов вне класса модели и затем обратиться к нему, определение вариантов и имен для каждого варианта внутри класса модели сохраняет всю эту информацию с классом, который его использует, и помогает ссылаться на варианты (например, Student.SOPHOMORE будет работать везде, где импортирована модель Student).

Вы также можете сгруппировать доступные варианты с именами для целей организации:

MEDIA_CHOICES = [
    ('Audio', (
            ('vinyl', 'Vinyl'),
            ('cd', 'CD'),
        )
    ),
    ('Video', (
            ('vhs', 'VHS Tape'),
            ('dvd', 'DVD'),
        )
    ),
    ('unknown', 'Unknown'),
]

Первый элемент каждой пары — имя, применяемое к группе. Второй элемент — набор пар из двух элементов, каждая пара содержит значение и удобочитаемое имя для варианта. Группированные варианты можно комбинировать с негруппированными вариантами в одном списке (например, вариант 'unknown' в этом примере).

Для каждого поля модели, у которого установлено choices, Django добавит метод для получения удобочитаемого имени текущего значения поля. См. get_FOO_display() в документации API базы данных.

Обратите внимание, что варианты могут быть любым объектом последовательности — не обязательно списком или кортежем. Это позволяет динамически создавать варианты. Но если вы обнаруживаете, что используете динамическую настройку choices, вам, вероятно, лучше использовать правильную таблицу базы данных с ForeignKey. choices предназначен для статических данных, которые меняются нечасто, если вообще меняются.

Примечание

Каждый раз, когда изменяется порядок choices создаётся новая миграция.

Если 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.choices,
        default=YearInSchool.FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in {
            self.YearInSchool.JUNIOR,
            self.YearInSchool.SENIOR,
        }

Они работают аналогично enum из стандартной библиотеки Python, но с некоторыми модификациями:

  • Значения элементов перечисления — кортеж аргументов, используемый при построении конкретного типа данных. Django поддерживает добавление дополнительного строкового значения в конец этого кортежа, которое будет использоваться в качестве удобочитаемого имени или label. label может быть ленивой локализованной строкой. Таким образом, в большинстве случаев значение элемента будет (value, label) парой из двух элементов. См. ниже пример наследования вариантов с использованием более сложного типа данных. Если кортеж не предоставлен или последний элемент не является (ленивой) строкой, label автоматически генерируется из имени члена.
  • Добавляется свойство .label к значениям, возвращающее удобочитаемое имя.
  • Для классов перечислений добавляется ряд пользовательских свойств — .choices, .labels, .values, и .names — для упрощения доступа к этим отдельным частям перечисления. Используйте .choices в качестве подходящего значения для передачи в choices при определении поля.
  • Использование 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.choices)

Также можно использовать функциональный API перечислений 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)')
    
Введено в Django 3.0:

Были добавлены классы TextChoices, IntegerChoices, и Choices.

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. Дополнительные ключи сообщений об ошибках указаны для каждого поля в разделе Типы полей ниже.

Эти сообщения об ошибках часто не передаются в формы. См. Учёт сообщений об ошибках моделей.

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, проверка будет выполняться в текущем часовом поясе в момент сохранения объекта.

END_OF_DOCUMENT_MARKER

Это обеспечивается 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)

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

BigAutoField

class BigAutoField(**options)

64-битное целое число, подобное AutoField, но гарантированно вмещает числа от 1 до 9223372036854775807.

BigIntegerField

class BigIntegerField(**options)

64-битное целое число, подобное IntegerField, но гарантированно вмещает числа от -9223372036854775808 до 9223372036854775807. По умолчанию виджет формы для этого поля — NumberInput.

BinaryField

class BinaryField(max_length=None, **options)

Поле для хранения двоичных данных. Ему можно присвоить bytes, bytearray или memoryview.

По умолчанию BinaryField устанавливает editable в False, в этом случае его нельзя включать в ModelForm.

BinaryField имеет один дополнительный необязательный аргумент:

BinaryField.max_length

Максимальная длина (в символах) поля. Максимальная длина проверяется в Django с помощью MaxLengthValidator.

Использование BinaryField

Хотя вы можете подумать о хранении файлов в базе данных, имейте в виду, что это плохой дизайн в 99% случаев. Это поле не заменяет правильную обработку статических файлов.

BooleanField

class BooleanField(**options)

Поле «истина/ложь».

По умолчанию виджет формы для этого поля — CheckboxInput, или NullBooleanSelect, если null=True.

Значение по умолчанию для BooleanField равно None, если Field.default не определено.

CharField

class CharField(max_length=None, **options)

Строковое поле для строк небольшого и большого размера.

Для больших объемов текста используйте TextField.

По умолчанию виджет формы для этого поля — TextInput.

CharField имеет один дополнительный обязательный аргумент:

CharField.max_length

Максимальная длина (в символах) поля. max_length проверяется на уровне базы данных и в Django с помощью MaxLengthValidator.

Примечание

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

DateField

class DateField(auto_now=False, auto_now_add=False, **options)

Дата, представленная в Python объектом типа datetime.date. Имеет несколько дополнительных необязательных аргументов:

DateField.auto_now

Автоматически устанавливает поле в текущую дату при каждом сохранении объекта. Полезно для временных меток «последнего изменения». Обратите внимание, что текущая дата всегда используется; это не просто значение по умолчанию, которое можно переопределить.

Поле обновляется только при вызове Model.save(). Поле не обновляется при внесении изменений в другие поля иными способами, например, с помощью QuerySet.update(), хотя вы можете указать пользовательское значение для поля при таком обновлении.

DateField.auto_now_add

Автоматически устанавливает поле в текущую дату при первом создании объекта. Полезно для создания временных меток. Обратите внимание, что текущая дата всегда используется; это не просто значение по умолчанию, которое можно переопределить. Поэтому даже если вы зададите значение для этого поля при создании объекта, оно будет проигнорировано. Если вы хотите иметь возможность изменить это поле, задайте следующее вместо auto_now_add=True:

  • Для DateField: default=date.today — из datetime.date.today()
  • Для DateTimeField: default=timezone.now — из django.utils.timezone.now()

По умолчанию виджет формы для этого поля — DateInput. Админка добавляет JavaScript-календарь и ярлык «Сегодня». Включает дополнительный invalid_date ключ сообщения об ошибке.

Параметры auto_now_add, auto_now, и default взаимно исключают друг друга. Любая комбинация этих параметров приведёт к ошибке.

Примечание

В текущей реализации установка auto_now или auto_now_add в True заставит поле иметь установленные значения editable=False и blank=True.

Примечание

Параметры auto_now и auto_now_add всегда будут использовать дату в по умолчанию часовом поясе в момент создания или обновления. Если вам нужно что-то другое, вы можете рассмотреть использование собственного вызываемого значения по умолчанию или переопределение save() вместо использования auto_now или auto_now_add; или использовать DateTimeField вместо DateField и решить, как обрабатывать преобразование datetime в date во время отображения.

DateTimeField

class DateTimeField(auto_now=False, auto_now_add=False, **options)

Дата и время, представленные в Python объектом datetime.datetime . Принимает те же дополнительные аргументы, что и DateField.

По умолчанию виджет формы для этого поля — единственный DateTimeInput. Админка использует два отдельных виджета TextInput с JavaScript-ярлыками.

DecimalField

class DecimalField(max_digits=None, decimal_places=None, **options)

Десятичное число с фиксированной точностью, представленное в 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 против DecimalField. Также следует учитывать ограничения SQLite для полей decimal.

DurationField

class DurationField(**options)

Поле для хранения периодов времени — моделируется в Python объектом timedelta. При использовании с PostgreSQL используется тип данных interval, а с Oracle — INTERVAL DAY(9) TO SECOND(6). В противном случае используется bigint микросекунд.

Примечание

Арифметические операции с DurationField работают в большинстве случаев. Однако на всех базах данных, кроме PostgreSQL, сравнение значения DurationField с арифметическими операциями над объектами DateTimeField не будет работать как ожидается.

EmailField

class EmailField(max_length=254, **options)

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

FileField

class FileField(upload_to=None, max_length=100, **options)

Поле для загрузки файлов.

Примечание

Аргумент primary_key не поддерживается и вызовет ошибку, если используется.

Имеет два необязательных аргумента:

FileField.upload_to

Этот атрибут предоставляет способ установки директории загрузки и имени файла, и может быть установлен двумя способами. В обоих случаях значение передаётся в метод Storage.save().

Если вы укажете строковое значение или объект Path, он может содержать strftime() форматирование, которое будет заменено датой/временем загрузки файла (чтобы загруженные файлы не заполняли заданную директорию). Например:

class MyModel(models.Model):
    # file will be uploaded to MEDIA_ROOT/uploads
    upload = models.FileField(upload_to='uploads/')
    # or...
    # file will be saved to MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

Если вы используете по умолчанию FileSystemStorage, строковое значение будет добавлен к пути MEDIA_ROOT, чтобы сформировать расположение в локальной файловой системе, где будут храниться загруженные файлы. Если вы используете другое хранилище, проверьте документацию этого хранилища, чтобы узнать, как оно обрабатывает upload_to.

upload_to также может быть вызываемым объектом, таким как функция. Это вызывается для получения пути загрузки, включая имя файла. Эта функция должна принимать два аргумента и возвращать путь в формате Unix (с прямыми косыми чертами), который будет передан системе хранения. Два аргумента:

Аргумент Описание
instance

Экземпляр модели, где определён FileField. Более конкретно, это конкретный экземпляр, где добавляется текущий файл.

В большинстве случаев этот объект ещё не был сохранён в базе данных, поэтому, если он использует значение по умолчанию AutoField, у него может ещё не быть значения для поля первичного ключа.

filename Имя файла, которое было первоначально задано файлу. Это может или не может быть учтено при определении конечного пути назначения.

Например:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)

class MyModel(models.Model):
    upload = models.FileField(upload_to=user_directory_path)
Изменено в Django 3.0:

Добавлена поддержка pathlib.Path.

FileField.storage

Объект хранения, который обрабатывает хранение и извлечение файлов. Подробности о том, как предоставить этот объект, см. в разделе Управление файлами.

Использование FileField или ImageField (см. ниже) в модели требует нескольких шагов:

  1. В файле настроек вам необходимо определить MEDIA_ROOT как полный путь к каталогу, в котором Django будет хранить загруженные файлы. (Для повышения производительности эти файлы не хранятся в базе данных.) Определите MEDIA_URL как базовый публичный URL этого каталога. Убедитесь, что этот каталог доступен для записи пользователю веб-сервера.
  2. Добавьте FileField или ImageField в вашу модель, определив опцию upload_to, чтобы указать подкаталог MEDIA_ROOT для загруженных файлов.
  3. В вашей базе данных будет храниться только путь к файлу (относительно 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

При доступе к FileField в модели вы получаете экземпляр FieldFile для доступа к подлежащему файлу.

API FieldFile аналогичен 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')

Открывает или повторно открывает файл, связанный с этим экземпляром, в указанном mode. В отличие от стандартного метода Python open(), он не возвращает дескриптор файла.

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

FieldFile.close()

Ведет себя как стандартный метод Python file.close() и закрывает файл, связанный с этим экземпляром.

FieldFile.save(name, content, save=True)

Этот метод принимает имя файла и содержимое файла и передает их классу хранения для поля, а затем связывает сохраненный файл с полем модели. Если вы хотите вручную связать данные файла с экземплярами FileField в вашей модели, используется метод save() для сохранения этих данных файла.

Принимает два обязательных аргумента: name, что является именем файла, и content, который содержит содержимое файла. Необязательный аргумент save управляет тем, сохраняется ли экземпляр модели после изменения файла, связанного с этим полем. По умолчанию True.

Обратите внимание, что аргумент content должен быть экземпляром django.core.files.File, а не встроенного в Python объекта файла. Вы можете создать File из существующего объекта файла Python следующим образом:

from django.core.files import File
# Open an existing file using Python's built-in open()
f = open('/path/to/hello.world')
myfile = File(f)

Или вы можете создать его из строки Python следующим образом:

from django.core.files.base import ContentFile
myfile = ContentFile("hello world")

Дополнительную информацию см. в разделе Управление файлами.

FieldFile.delete(save=True)

Удаляет файл, связанный с этим экземпляром, и очищает все атрибуты поля. Примечание: этот метод закроет файл, если он окажется открытым во время вызова delete().

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

Обратите внимание, что при удалении модели связанные файлы не удаляются. Если вам нужно очистить оставшиеся файлы, вам нужно будет сделать это самостоятельно (например, с помощью пользовательской команды управления, которая может выполняться вручную или планироваться для периодического запуска, например, через cron).

FilePathField

class FilePathField(path='', match=None, recursive=False, allow_files=True, allow_folders=False, max_length=100, **options)

A 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)
Изменено в Django 3.0:

path теперь может быть вызываемой функцией.

FilePathField.match

Необязательно. Регулярное выражение в виде строки, которое FilePathField будет использовать для фильтрации имён файлов. Обратите внимание, что регулярное выражение будет применено к имени файла без пути, а не к полному пути. Пример: "foo.*\.txt$", который будет соответствовать файлу под названием foo23.txt, но не bar.txt или foo23.png.

FilePathField.recursive

Необязательно. Либо True либо False. По умолчанию False. Указывает, должны ли быть включены все подкаталоги каталога path.

FilePathField.allow_files

Необязательно. Либо True либо False. По умолчанию True. Указывает, должны ли файлы в указанном месте быть включены. Либо это, либо allow_folders должны быть True.

FilePathField.allow_folders

Необязательно. Либо True либо False. По умолчанию False. Указывает, должны ли каталоги в указанном месте быть включены. Либо это, либо allow_files должны быть True.

Конечно, эти аргументы можно использовать вместе.

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

FilePathField(path="/home/images", match="foo.*", recursive=True)

…будет соответствовать /home/images/foo.png, но не /home/images/foo/bar.png, так как match применяется к имени файла без пути (foo.png и bar.png).

Экземпляры FilePathField создаются в вашей базе данных как столбцы varchar с максимальной длиной по умолчанию 100 символов. Как и в других полях, вы можете изменить максимальную длину, используя аргумент max_length.

FloatField

class FloatField(**options)

Вещественное число, представленное в Python объектом типа float.

Поле по умолчанию для формы - NumberInput, когда localize имеет значение False, или TextInput в противном случае.

FloatField 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)

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

В дополнение к специальным атрибутам, доступным для FileField, у ImageField также есть атрибуты height и width.

Для облегчения запросов по этим атрибутам, у ImageField есть два дополнительных необязательных аргумента:

ImageField.height_field

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

ImageField.width_field

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

Требует библиотеку Pillow.

Экземпляры ImageField создаются в вашей базе данных как столбцы varchar с максимальной длиной по умолчанию 100 символов. Как и в других полях, вы можете изменить максимальную длину, используя аргумент max_length.

Поле по умолчанию для формы - ClearableFileInput.

IntegerField

class IntegerField(**options)

Целое число. Значения от -2147483648 до 2147483647 безопасны во всех базах данных, поддерживаемых Django.

Использует MinValueValidator и MaxValueValidator для проверки входных данных на основе поддерживаемых базой данных значений.

Поле по умолчанию для формы - NumberInput, когда localize имеет значение False, или TextInput в противном случае.

GenericIPAddressField

class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)

Адрес IPv4 или IPv6 в строковом формате (например, 192.0.2.30 или 2a02:42fe::4). Поле по умолчанию для формы - TextInput.

END_OF_DOCUMENT_MARKER

Нормализация адресов 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

Ограничивает допустимые входные данные указанным протоколом. Допустимые значения — 'both' (по умолчанию), 'IPv4' или 'IPv6'. Сопоставление нечувствительно к регистру.

GenericIPAddressField.unpack_ipv4

Распаковывает адреса IPv4, такие как ::ffff:192.0.2.1. Если этот параметр включен, указанный адрес будет распакован до 192.0.2.1. По умолчанию отключено. Может использоваться только при protocol установленном на 'both'.

Если вы допускаете пустые значения, вам необходимо разрешить значения null, так как пустые значения хранятся как null.

NullBooleanField

class NullBooleanField(**options)

Аналогично BooleanField с null=True. Используйте его вместо этого поля, так как оно, вероятно, будет устаревшим в будущих версиях 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)

Псевдоним — термин из журналистики. Псевдоним — короткое обозначение чего-либо, содержащее только буквы, цифры, символы подчеркивания или дефисы. Они обычно используются в URL-адресах.

Как и CharField, вы можете указать max_length (прочитайте примечание об универсальности базы данных и max_length в этом разделе тоже). Если max_length не указано, Django будет использовать длину по умолчанию 50.

Подразумевает установку Field.db_index на True.

Часто бывает полезно автоматически заполнять SlugField на основе значения другого поля. Вы можете сделать это автоматически в админ-панели, используя prepopulated_fields.

Использует validate_slug или validate_unicode_slug для валидации.

SlugField.allow_unicode

Если True, поле принимает символы Unicode в дополнение к символам ASCII. По умолчанию False.

SmallAutoField

class SmallAutoField(**options)
Новое в Django 3.0.

Как и AutoField, но допускает только значения меньше определенного (зависимого от базы данных) предела. Значения от 1 до 32767 безопасны во всех базах данных, поддерживаемых Django.

SmallIntegerField

class SmallIntegerField(**options)

Как и IntegerField, но допускает только значения меньше определенной (зависимой от базы данных) границы. Значения от -32768 до 32767 безопасны во всех базах данных, поддерживаемых Django.

TextField

class TextField(**options)

Поле для хранения большого текста. По умолчанию виджет для этого поля — Textarea.

Если вы укажете атрибут max_length, он будет отображён в виджете Textarea автоматически генерируемого поля формы. Однако он не накладывается на уровень модели или базы данных. Используйте CharField для этого.

TimeField

class TimeField(auto_now=False, auto_now_add=False, **options)

Время, представленное в Python экземпляром datetime.time . Допускает те же варианты автоматического заполнения, что и DateField.

По умолчанию виджет для этого поля — TimeInput. В админ-панели добавлены некоторые JavaScript-короткорешения.

URLField

class URLField(max_length=200, **options)

CharField для URL-адреса, валидируемого URLValidator.

По умолчанию виджет для этого поля — URLInput.

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

UUIDField

class UUIDField(**options)

Поле для хранения универсальных уникальных идентификаторов. Использует класс Python UUID. При использовании в PostgreSQL хранится в формате 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 хранит их в типе данных hyphenated uuid.

Связанные поля

Django также определяет набор полей, которые представляют отношения.

ForeignKey

class ForeignKey(to, on_delete, **options)

Отношение «многие ко многим». Требует двух позиционных аргументов: класс, к которому относится модель, и опцию 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

Определяемые таким образом отношения в абстрактных моделях разрешаются при подклассировании модели в качестве конкретной модели и не относительны к абстрактной модели app_label:

products/models.py
from django.db import models

class AbstractCar(models.Model):
    manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE)

    class Meta:
        abstract = True
production/models.py
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. Например, если у вас есть необязательный ForeignKey и вы хотите, чтобы он был установлен в null при удалении связанного объекта:

user = models.ForeignKey(
    User,
    models.SET_NULL,
    blank=True,
    null=True,
)

on_delete не создает SQL-ограничение в базе данных. Поддержка ограничений каскадных действий на уровне базы данных может быть реализована позже.

Возможные значения для on_delete находятся в django.db.models:

  • CASCADE

    Каскадное удаление. Django эмулирует поведение SQL-ограничения ON DELETE CASCADE и также удаляет объект, содержащий ForeignKey.

    Model.delete() не вызывается для связанных моделей, но сигналы pre_delete и post_delete отправляются для всех удаляемых объектов.

  • PROTECT

    Предотвращает удаление связанного объекта, вызывая ProtectedError, подкласс django.db.IntegrityError.

  • SET_NULL

    Устанавливает ForeignKey в null; это возможно только если null равно True.

  • SET_DEFAULT

    Устанавливает ForeignKey в его значение по умолчанию; значение по умолчанию для ForeignKey должно быть установлено.

  • SET()

    Устанавливает ForeignKey в переданное значение в SET(), или, если передана вызываемая функция, в результат ее вызова. В большинстве случаев передача вызываемой функции необходима для предотвращения выполнения запросов при импорте ваших моделей.

    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

    Не выполнять никаких действий. Если ваше бэкенд-приложение базы данных принуждает к ссылочной целостности, это приведет к IntegrityError, если вы вручную не добавите SQL ON 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 используется вызываемая функция, она будет вызываться каждый раз при создании новой формы. Она также может быть вызвана при валидации модели, например, при выполнении команд управления или в админке. Админка создает наборы запросов для проверки входных данных формы в различных особых случаях несколько раз, поэтому существует вероятность, что ваша вызываемая функция будет вызвана несколько раз.

ForeignKey.related_name

Имя для отношения от связанного объекта обратно к этому объекту. Это также значение по умолчанию для related_query_name (имя для имени обратного фильтра от целевой модели). См. документацию по связанным объектам для полного объяснения и примера. Обратите внимание, что вы должны задать это значение при определении отношений для абстрактных моделей; и при этом доступен некоторый специальный синтаксис.

Если вы предпочитаете, чтобы Django не создавал обратного отношения, установите related_name в '+' или закончите его '+'. Например, это гарантирует, что модель User не будет иметь обратного отношения к этой модели:

user = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
    related_name='+',
)
ForeignKey.related_query_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 означает, что миграции, сделанные с этим ForeignKey, всегда будут ссылаться на ту же самую модель, которую вы указали (поэтому это жёстко провалится, если пользователь попытается запустить с моделью User, которую вы не поддерживаете, например).

В случае сомнений оставьте значение по умолчанию True.

ManyToManyField

class ManyToManyField(to, **options)

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

Связанные объекты можно добавлять, удалять или создавать с помощью RelatedManager поля.

Представление в базе данных

Внутри Django создаёт промежуточную таблицу соединения для представления связи многие ко многим. По умолчанию имя этой таблицы генерируется, используя имя поля многие ко многим и имя таблицы модели, которая его содержит. Поскольку некоторые базы данных не поддерживают имена таблиц большей длины, эти имена таблиц будут автоматически усечены, и будет использоваться хэш для уникальности, например, author_books_9cdf. Вы можете вручную указать имя таблицы соединения с помощью опции db_table.

Аргументы

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

ManyToManyField.related_name

То же, что и ForeignKey.related_name.

ManyToManyField.related_query_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 отношениям быть несимметричными.

Изменено в Django 3.0:

Разрешено указание symmetrical=True для рекурсивных связей многие ко многим с использованием промежуточной модели.

ManyToManyField.through

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

Наиболее распространённое использование этой опции — когда вы хотите связать дополнительные данные с отношением многие ко многим.

Примечание

Если вы не хотите иметь несколько ассоциаций между одними и теми же экземплярами, добавьте UniqueConstraint, включая поля from и to. Автоматически генерируемые таблицы Django многие ко многим включают такое ограничение.

Примечание

Рекурсивные связи, использующие промежуточную модель и определённые как симметричные (то есть с symmetrical=True, что является значением по умолчанию), не могут определить имена обратных аксессоров, так как они будут одинаковыми. Вам нужно установить related_name хотя бы для одного из них. Если вы предпочитаете, чтобы Django не создавал обратную связь, установите related_name в '+'.

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

Если исходная и целевая модели различаются, генерируются следующие поля:

  • id: первичный ключ отношения.
  • <containing_model>_id: id модели, которая объявляет ManyToManyField.
  • <other_model>_id: id модели, к которой ManyToManyField указывает.

Если ManyToManyField указывает от и к одной и той же модели, генерируются следующие поля:

  • id: первичный ключ отношения.
  • from_<model>_id: id экземпляра, который указывает на модель (т.е. исходный экземпляр).
  • to_<model>_id: id экземпляра, к которому относится отношение (т.е. целевой экземпляр модели).

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

Model.m2mfield.through.objects.all()
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 должен использовать.

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)

Связь «один к одному». По сути, она похожа на 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

Исключение RelatedObjectDoesNotExist генерируется при обращении к обратной связи, если записи в связанной таблице нет. Это подкласс исключения Model.DoesNotExist целевой модели. Например, если у пользователя нет руководителя, назначенного через MySpecialUser:

>>> user.supervisor_of
Traceback (most recent call last):
    ...
RelatedObjectDoesNotExist: User has no supervisor_of.

Кроме того, OneToOneField принимает все дополнительные аргументы, которые принимает ForeignKey, плюс один дополнительный аргумент:

OneToOneField.parent_link

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

См. Примеры связей «один к одному» для примеров использования OneToOneField.

Field API reference

class Field

Field — это абстрактный класс, представляющий столбец таблицы базы данных. Django использует поля для создания таблицы базы данных (db_type()), для сопоставления типов Python с базой данных (get_prep_value()) и наоборот (from_db_value()).

Поле является фундаментальным элементом различных API Django, в частности, models и querysets.

В моделях поле создаётся как атрибут класса и представляет собой определённый столбец таблицы, см. Модели. Оно имеет атрибуты, такие как null и unique, а также методы, которые Django использует для сопоставления значения поля с значениями, специфичными для базы данных.

Field — подкласс RegisterLookupMixin, поэтому на нём можно зарегистрировать как Transform, так и Lookup для использования в QuerySet (например, field_name__exact="foo"). Все встроенные поиски регистрируются по умолчанию.

Все встроенные поля Django, такие как CharField, являются конкретными реализациями Field. Если вам нужно настраиваемое поле, вы можете либо создать подкласс любого из встроенных полей, либо написать Field с нуля. В любом случае, см. Создание пользовательских полей модели.

description

Подробное описание поля, например, для приложения django.contrib.admindocs.

Описание может быть в формате:

description = _("String (up to %(max_length)s)")

где аргументы интерполируются из __dict__ поля.

descriptor_class
Новое в Django 3.0.

Класс, реализующий протокол дескриптора, который инициализируется и назначается атрибуту экземпляра модели. Конструктор должен принимать один аргумент, экземпляр Field. Переопределение этого атрибута класса позволяет настроить поведение get и set.

Для сопоставления Field со специфичным для базы данных типом Django предоставляет несколько методов:

get_internal_type()

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

См. Эмуляция встроенных типов полей для использования в пользовательских полях.

db_type(connection)

Возвращает тип данных столбца базы данных для Field, учитывая connection.

См. Пользовательские типы базы данных для использования в пользовательских полях.

rel_db_type(connection)

Возвращает тип данных столбца базы данных для полей, таких как ForeignKey и OneToOneField , которые указывают на Field, учитывая connection.

См. Пользовательские типы базы данных для использования в пользовательских полях.

Существует три основных ситуации, когда Django взаимодействует с бэкендом базы данных и полями:

  • при запросе к базе данных (значение Python -> значение бэкенда базы данных)
  • при загрузке данных из базы данных (значение бэкенда базы данных -> значение Python)
  • при сохранении в базе данных (значение Python -> значение бэкенда базы данных)

При запросах используются get_db_prep_value() и get_prep_value():

get_prep_value(value)

value — текущее значение атрибута модели, и метод должен вернуть данные в формате, подготовленном для использования в качестве параметра в запросе.

См. Преобразование объектов Python в значения запросов для использования.

get_db_prep_value(value, connection, prepared=False)

Преобразует value в значение, специфичное для бэкенда. По умолчанию возвращает value , если prepared=True , и get_prep_value(), если это False.

См. Преобразование значений запросов в значения базы данных для использования.

При загрузке данных используется from_db_value():

from_db_value(value, expression, connection)

Преобразует значение, возвращённое базой данных, в объект Python. Это обратное преобразование get_prep_value().

Этот метод не используется для большинства встроенных полей, так как бэкенд базы данных уже возвращает правильный тип Python, или сам бэкенд выполняет преобразование.

expression равно self.

См. Преобразование значений в объекты Python для использования.

Примечание

По соображениям производительности from_db_value не реализован как no-op для полей, которые его не требуют (все поля Django). Поэтому вы не можете вызвать super в своём определении.

При сохранении используются pre_save() и get_db_prep_save():

get_db_prep_save(value, connection)

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

pre_save(model_instance, add)

Метод, вызываемый перед get_db_prep_save() для подготовки значения перед сохранением (например, для DateField.auto_now).

model_instance — экземпляр, к которому принадлежит это поле, а add — является ли экземпляр сохраняемым в базе данных впервые.

Он должен возвращать значение соответствующего атрибута из model_instance для этого поля. Имя атрибута содержится в self.attname (это устанавливается Field).

См. Предварительная обработка значений перед сохранением для использования.

Поля часто получают свои значения в другом типе, например, из сериализации или из форм.

to_python(value)

Преобразует значение в правильный объект Python. Он действует как обратное преобразование value_to_string() и также вызывается в clean().

См. Преобразование значений в объекты Python для использования.

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

value_from_object(obj)

Возвращает значение поля для данного экземпляра модели.

Этот метод часто используется value_to_string().

value_to_string(obj)

Преобразует obj в строку. Используется для сериализации значения поля.

См. Преобразование данных поля для сериализации для использования.

При использовании model forms, Field нужно знать, какое поле формы оно должно представлять:

formfield(form_class=None, choices_form_class=None, **kwargs)

Возвращает значение по умолчанию django.forms.Field этого поля для ModelForm.

По умолчанию, если оба form_class и choices_form_class None, используется CharField. Если у поля есть choices и choices_form_class не указано, используется TypedChoiceField.

См. Указание поля формы для поля модели для использования.

deconstruct()

Возвращает 4-кортеж с достаточной информацией для восстановления поля:

  1. Имя поля в модели.
  2. Путь импорта поля (например, "django.db.models.IntegerField"). Это должно быть наиболее переносимое представление, поэтому менее конкретное может быть лучше.
  3. Список позиционных аргументов.
  4. Словарь ключевых аргументов.

Этот метод должен быть добавлен к полям до версии 1.7 для миграции данных с помощью Миграций.

Справочник по атрибутам поля

Каждый экземпляр Field содержит несколько атрибутов, которые позволяют инспектировать его поведение. Используйте эти атрибуты вместо isinstance проверок, когда вам нужно написать код, зависящий от функциональности поля. Эти атрибуты можно использовать совместно с API модели _meta для сужения поиска определенных типов полей. Пользовательские поля модели должны реализовывать эти флаги.

Атрибуты для полей

Field.auto_created

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

Field.concrete

Флаг булевского типа, указывающий, связано ли с полем поле базы данных.

Field.hidden

Флаг булевского типа, указывающий, используется ли поле для обеспечения функциональности другого поля, не являющегося скрытым (например, content_type и object_id поля, которые составляют GenericForeignKey). Флаг hidden используется для различения того, что составляет публичную подмножество полей в модели от всех полей в модели.

Примечание

Options.get_fields() по умолчанию исключает скрытые поля. Передайте include_hidden=True , чтобы вернуть скрытые поля в результатах.

Field.is_relation

Флаг булевского типа, указывающий, содержит ли поле ссылки на одну или несколько других моделей для своей функциональности (например, ForeignKey, ManyToManyField, OneToOneField, и т.д.).

Field.model

Возвращает модель, в которой определено поле. Если поле определено в суперклассе модели, model будет ссылаться на суперкласс, а не на класс экземпляра.

Атрибуты для полей с отношениями

Эти атрибуты используются для запроса кратности и других деталей отношения. Эти атрибуты присутствуют во всех полях; однако, они будут иметь только значения boolean (а не 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 в противном случае.

Field.related_model

Указывает на модель, с которой связано поле. Например, Author в ForeignKey(Author, on_delete=models.CASCADE). Связанная модель для GenericForeignKey всегда None.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.0/ref/models/fields/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API