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

Этот раздел содержит все существующие подробности о всех параметрах поля и типах полей в Django.

См.также

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

Примечание

Технически, эти поля определенны в django.db.models.fields, но для удобства они испортированны в django.db.models; по неписанному соглашению принято использовать from django.db import models и обращаться к полям, как models.<Foo>Field.

Параметры поля

Приведенные аргументы доступны для всех полей. Все они не обязательны.

null

Field.null

При True Django сохранит пустое значение как NULL в базе данных. Значение по-умолчанию – False.

Заметим, что пустая строка всегда сохраняется как пустая строка, а не как NULL. Используйте null=True только для не строковых полей, таких как числовые, булевы и даты. Для всех типов полей, вы так же должны указать blank=True если вы хотите разрешить пустые значения в формах, т.к. параметр null влияет только на сохранение в базе данных (смотрите blank).

Избегайте использования null для строковых полей таких, как CharField и TextField, если только у вас нет причин для этого. Если строковое поле содержит null=True, это означает, что оно может содержать два возможных “пустых” значения: NULL и пустую строку. В большинстве случаев избыточно иметь два варианты “пустых” значений. Правило Django использовать пустую строку, вместо NULL.

Примечание

Базу данных Oracle принуждает использовать параметр null=True для полей содержащих пустые строки, т.к. пустая строка в любом случае будет сохранена как NULL.

Если хотите использовать null для BooleanField, используйте NullBooleanField вместо этого.

blank

Field.blank

При True поле может быть хранить пустое значение. Значение по-умолчанию – False.

Заметим что этот параметр отличается от null. null указывается для базы данных, в то время как blank – для проверки данных. При blank=True, проверка данных в интерфейсе администратора Django позволит сохранять пустое значение в поле. При blank=False поле будет обязательным.

choices

Field.choices

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

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

Список выбора выглядит следующим образом:

YEAR_IN_SCHOOL_CHOICES = (
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
    ('GR', 'Graduate'),
)

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

Список выбора может быть определен как часть класса модели:

class Foo(models.Model):
    GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

или вне модели:

GENDER_CHOICES = (
    ('M', 'Male'),
    ('F', 'Female'),
)
class Foo(models.Model):
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

Вы можете сгруппировать значения в именованные группы:

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

db_column

Field.db_column

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

Если имя колонки это зарезервированное SQL слово, или содержит символы запрещенные в названиях переменной в Python – в частности, дефис – все нормально. Django автоматически экранирует название колонок и таблиц.

db_index

Field.db_index

При True, будет добавлен CREATE INDEX для этого поля.

db_tablespace

Field.db_tablespace

Имя “tablespace” базы данных используемое для индекса поля, если поле имеет индекс. По-умолчанию используется значение настройки DEFAULT_INDEX_TABLESPACE проекта, если оно указано, иначе db_tablespace модели. Если база данных не поддерживает “tablespace” для индексов, этот параметр будет проигнорирован.

default

Field.default

Значение по-умолчанию для поля. Это может быть значение или вызываемый(callable) объект. Если это вызываемый объект, он будет вызван при создании нового объекта.

editable

Field.editable

При False, поле будет не редактируемое в интерфейсе администратора или форме автоматически созданной для модели. Значение по-умолчанию – True.

error_messages

Добавлено в Django 1.2.
Field.error_messages

error_messages позволяет переопределить сообщения ошибок возвращаемых полем. Используйте словарь с ключами соответствующими необходимым ошибкам.

Ключи ошибок такие: null, blank, invalid, invalid_choice и unique. Дополнительные ошибки указаны для каждого типа поля ниже.

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 самостоятельно добавит IntegerField для хранения первичного ключа, вы не обязаны указывать primary_key=True, если не хотите переопределить первичный ключ по-умолчанию. Подробнее смотрите Первичный ключ по-умолчанию.

primary_key=True подразумевает null=False и unique=True. Модель может содержать только один первичный ключ.

unique

Field.unique

При True значение поля должно быть уникальным.

Этот параметр учитывается при сохранении в базу данных и при проверке данных в форме. Если вы попытаетесь сохранить повторное значение в поле с unique, будет вызвана ошибка django.db.IntegrityError методом save().

Этот параметр можно использовать для любого типа поля кроме ManyToManyField и FileField.

unique_for_date

Field.unique_for_date

Этот параметр должен быть равен названию DateField или DateTimeField поля, для которого значение должно быть уникальным.

Например, если модель имеет поле title с unique_for_date="pub_date", тогда Django позволит сохранять записи только с уникальной комбинацией title и pub_date.

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

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

Добавлено в Django 1.2.
Field.validators

Список проверок(“валидаторов”) выполняемых для этого поля. Смотрите раздел о “валидаторах” для подробной информации.

Типы полей

AutoField

class AutoField(**options)

Автоинкрементное поле IntegerField. Используется для хранения ID. Скорее всего вам не придется использовать это поле, первичный ключ будет автоматически добавлен к модели. Смотрите Первичный ключ по-умолчанию.

BigIntegerField

Добавлено в Django 1.2.
class BigIntegerField([**options])

64-битное целочисленное, аналогично IntegerField но позволяет хранить числа от -9223372036854775808 до 9223372036854775807. Интерфейс администратора использует <input type="text"> (одно строчное поле ввода) для отображения.

BooleanField

class BooleanField(**options)

Поле хранящее значение true/false.

Интерфейс администратора отображает его как “checkbox”.

Если вам нужен параметр null, используйте поле NullBooleanField.

CharField

class CharField(max_length=None[, **options])

Строковое поле для хранения коротких или длинных строк.

Для большого количества текстовой информации используйте TextField.

Интерфейс администратора отображает поле как <input type="text">.

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

CharField.max_length

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

Примечание

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

MySQL users

Если вы используете это поле с MySQLdb 1.2.2 и utf8_bin “collation” (которое не является значением по-умолчанию), могут быть некоторые проблемы. Смотрите советы при работе с MySQL для подробностей.

CommaSeparatedIntegerField

class CommaSeparatedIntegerField(max_length=None[, **options])

Поле содержащее целые числа разделенные запятыми. Как и в CharField, необходим параметр max_length. Упомянутые особенности работы с различными типами баз данных так же актуальны.

DateField

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

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

DateField.auto_now

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

DateField.auto_now_add

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

В интерфейсе администратора поле будет представлено как <input type="text"> с JavaScript календарем, и кнопкой “Сегодня”. Содержит дополнительную ошибку invalid_date.

Примечание

При использовании auto_now или auto_now_add со значением True будут установлены параметры editable=False и blank=True.

DateTimeField

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

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

В интерфейсе администратора поле будет представлено как <input type="text"> с JavaScript виджетом.

DecimalField

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

Десятичное число с фиксированной точностью, представленное объектом Decimal Python. Принимает два обязательных параметра:

DecimalField.max_digits

Максимальное количество цифр в числе. Заметим, что это число должно быть больше или равно decimal_places, если оно не равно нулю.

DecimalField.decimal_places

Количество знаков после запятой.

Например, для хранения числа до 999 с двумя знаками после запятой, используйте:

models.DecimalField(..., max_digits=5, decimal_places=2)

Для хранения числа до миллиарда и 10 знаков после запятой:

models.DecimalField(..., max_digits=19, decimal_places=10)

Интерфейс администратора отображает поле как <input type="text">.

Примечание

Для дополнительной информации о разнице между FloatField и DecimalField, смотрите раздел FloatField vs. DecimalField.

EmailField

class EmailField([max_length=75, **options])

Поле CharField для хранения правильного email-адреса.

FileField

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

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

Примечание

primary_key и unique не принимаются, и вызовут исключение TypeError при использовании.

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

FileField.upload_to

Путь в файловой системе относительный настройке MEDIA_ROOT для определения атрибута url.

Поддерживает форматирование strftime(), которое будет заменено на дату/время загруженного файла (и загружаемые файлы не заполнят один каталог).

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

Аргумент

Описание

instance

Экземпляр модели, для которой определено поле FileField. Точнее, это объект для которого сохраняется текущий файл.

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

filename

Оригинальное имя файла. Вы можете его учитывать, или проигнорировать, при определении окончательного пути к файлу.

Так же принимается один дополнительный параметр:

FileField.storage

Необязателен. Объект “storage”, который отвечает за хранение и получение файлов. Смотрите Managing files для подробной информации.

Интерфейс администратора отображает это поле как <input type="file">.

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

  1. В файле настроек необходимо определить MEDIA_ROOT, как полный путь к каталогу, куда Django должен сохранять файлы. (Для производительность файлы не хранятся в базе данных.) Определить MEDIA_URL, который является URL-ом к этому каталогу и используется для создания URL-а к файлу. Убедитесь, что пользователь, от которого работает сервер, имеет права записи в этот каталог.

  2. Добавьте FileField или ImageField к модели, убедитесь что определили upload_to что бы указать DJango в каком под-каталоге в MEDIA_ROOT должны быть сохранены файлы.

  3. Все, что будет сохранено в базе данных, это путь к файлу (относительно MEDIA_ROOT). Скорее всего вы будете использовать url предоставленную Django. Например, если ImageField назван mug_shot, вы можете получить URL к файлу в шаблоне используя {{ object.mug_shot.url }}.

Например, MEDIA_ROOT равен '/home/media', и upload_to равен 'photos/%Y/%m/%d'. '%Y/%m/%d' часть параметра upload_to это форматирование strftime(); '%Y' – год из 4-х цифр, '%m' – номер месяца из 2-х цифр и '%d' – число месяца из 2-х цифр. Если вы загрузили файл 15 января 2007, он будет сохранен в каталоге /home/media/photos/2007/01/15.

Если вам нужны название файла или его размер, используйте атрибуты name и size соответственно; больше информации о доступных методах и атрибутах вы найдете в справке о File и разделе документации Managing files.

Примечание

Процесс сохранения файла часть процесса сохранения объекта, таким образом имя файла сохраненного на диске не будет доступно, пока объект не будет сохранен.

Что бы получить URL к загруженному файлу используйте атрибут url. При этом будет вызван метод url() класса Storage.

Заметим, что при загрузке файлов, вы должны обращать внимание куда вы загружаете файлы и какие типы файлов загружаются, что бы предотвратить возможные уязвимости в защите системы. Проверяйте все загружаемые файлы. Например, если вы разрешите загрузить файл без проверки в каталог, которая обрабатывается сервером, кто-нибудь сможет загрузить CGI или PHP скрипт и выполнить его посетив его URL на вашем сайте. Не допускайте это.

Так же заметим что это относится и к HTML файлам, так как они могу быть выполнены в браузере(хоть и не на сервере), и нести угрозу XSS или CSRF атаки.

По-умолчанию, экземпляр FileField создается как колонка varchar(100) в базе данных. Как и с другими полями вы можете изменить максимальную длину используя аргумент max_length.

FileField и FieldFile

При доступе к FileField модели, вы получаете экземпляр FieldFile как “proxy” для работы с файлом. Этот класс содержит несколько методов для работы с файлом:

FieldFile.open(mode='rb')

Работает так же как и родной метод Python open(), открывает файл связанный с объектом в режиме определенном аргументом mode.

FieldFile.close()

Работает так же как и метод file.close() в Python и закрывает файл связанный с объектом.

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

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

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

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

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

Или же создать из строки с содержимым файла:

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

Подробности в Managing files.

FieldFile.delete(save=True)

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

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

FilePathField

class FilePathField(path=None[, match=None, recursive=False, max_length=100, **options])

Поле CharField значение которого ограничено именем файла из определенного каталога. Принимает три дополнительных аргумента, первый из них обязателен:

FilePathField.path

Обязательно. Абсолютный путь к каталогу, из которого FilePathField принимает значение. Например: "/home/images".

FilePathField.match

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

FilePathField.recursive

Необязательный. Принимает True или False. По-умолчанию False. Определяет должны ли быть включены подкаталоги path.

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

Следует помнить, что match применяется к имени файла, а не абсолютному пути. Таким образом:

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

...пропустит /home/images/foo.gif но не /home/images/foo/bar.gif т.к. match применяется к имени файла (foo.gif и bar.gif).

По-умолчанию, экземпляр FilePathField создается как колонка varchar(100) в базе данных. Как и с другими полями вы можете изменить максимальную длину используя аргумент max_length.

FloatField

class FloatField([**options])

Число с плавающей точкой представленное объектом float.

Интерфейс администратора отображает поле как <input type="text">.

FloatField vs. DecimalField

FloatField иногда путают с DecimalField. Хоть оба и представляют вещественные числа, они делают это по разному. FloatField использует тип float в Python, в то время как DecimalField использует тип 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

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

Требуется Python Imaging Library.

По-умолчанию, экземпляр ImageField создается как колонка varchar(100) в базе данных. Как и с другими полями вы можете изменить максимальную длину используя аргумент max_length.

IntegerField

class IntegerField([**options])

Целое число. Интерфейс администратора отображает его как <input type="text">.

IPAddressField

class IPAddressField([**options])

IP адрес в виде строки(например, “192.0.2.30”). Интерфейс администратора отображает его как <input type="text">.

GenericIPAddressField

class GenericIPAddressField([protocol=both, unpack_ipv4=False, **options])
Добавлено в Django 1.4.

Адрес IPv4 или IPv6 в виде строки (например, 192.0.2.30 или 2a02:42fe::4). Интерфейс администратора отображает его как <input type="text">.

Преобразование адреса IPv6 происходит в соответствии с RFC 4291 раздел 2.2, включая рекомендации по форматированию IPv4 в параграфа 3 этого раздела, таких как ::ffff:192.0.2.0. Например, 2001:0::0:01 будет преобразован 2001::1, а ::ffff:0a0a:0a0a в ::ffff:10.10.10.10. Все символы будет преобразованы в нижний регистр.

GenericIPAddressField.protocol

Определяет формат IP адреса. Принимает значение 'both' (по-умолчанию), 'IPv4' или 'IPv6'. Значение не чувствительно регистру.

GenericIPAddressField.unpack_ipv4

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

NullBooleanField

class NullBooleanField([**options])

Как и BooleanField, но принимает значение NULL. Используете его вместо BooleanField с null=True. Интерфейс администратора отображает его как <select> с вариантами выбора “Неизвестное”, “Да” и “Нет”.

PositiveIntegerField

class PositiveIntegerField([**options])

Как и поле IntegerField, но значение должно быть больше или равно нулю (0). Значение 0 принимается для обратной совместимости.

PositiveSmallIntegerField

class PositiveSmallIntegerField([**options])

Как и поле PositiveIntegerField, но принимает значения в определенном диапазоне(зависит от типа базы данных).

SlugField

class SlugField([max_length=50, **options])

Slug – газетный термин. “Slug” – это короткое название-метка, которое содержит только буквы, числа, нижнее подчеркивание или дефис. В основном используются в URL.

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

Устанавливает Field.db_index в True, если аргумент явно не указан.

Обычно значение SlugField создается основываясь на какому-то другом значении(например, название статьи). Это может работать автоматически в интерфейсе администрации благодаря параметру prepopulated_fields.

SmallIntegerField

class SmallIntegerField([**options])

Как и поле IntegerField, но принимает значения в определенном диапазоне(зависит от типа базы данных).

TextField

class TextField([**options])

Большое текстовое поле. Интерфейс администратора отображает поле как <textarea>.

MySQL users

Если вы используете это поле с MySQLdb 1.2.1p2 и utf8_bin “collation” (которое не является значением по-умолчанию), могут быть некоторые проблемы. Смотрите советы при работе с MySQL для подробностей.

TimeField

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

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

Интерфейс администратора отображает поле как <input type="text"> с JavaScript виджетом.

URLField

class URLField([verify_exists=False, max_length=200, **options])

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

Не рекомендуется, начиная с версии 1.4: verify_exists is deprecated for security reasons as of 1.4 and will be removed in Django 1.5. Prior to 1.3.1, the default value was True.

URLField.verify_exists

При True, переданный URL будет проверен на доступность (то есть страница по этому адресу доступна для загрузки и не возарвщает ответ со статусом 404) используя HEAD запрос. Перенаправления разрешены, но не обрабатываются.

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

Интерфейс администратора отображает поле как <input type="text">.

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

Поля отношений

Django предоставляет набор полей для определения связей между моделями.

ForeignKey

class ForeignKey(othermodel[, **options])

Связь многое-к-одному. Принимает позиционный аргумент: класс связанной модели.

Для создания рекурсивной связи – объект со связью многое-к-одному на себя – используйте models.ForeignKey('self').

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

class Car(models.Model):
    manufacturer = models.ForeignKey('Manufacturer')
    # ...

class Manufacturer(models.Model):
    # ...

Для связи на модель из другого приложения используйте название модели и приложения. Например, если модель Manufacturer находится в приложении production, используйте:

class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')

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

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

За кулисами, Django добавляет "_id" к названию поля для создания названия колонки. В примере выше, таблица для модели Car будет содержать колонку manufacturer_id. (Такое поведение можно изменить указав аргумент db_column) Хотя, ваш код никогда не должен использовать названий колонок, если только вы не используете чистый SQL. Вы всегда будете использовать названия полей модели.

Параметры

ForeignKey принимает дополнительные аргументы – все не обязательны – которые определяют ка должна работать связь.

ForeignKey.limit_choices_to

Словарь параметров для фильтрации (смотрите Выполнение запросов), которые ограничивают множество связанных объектов, отображаемых в интерфейсе администратора для этого поля. Используйте функции модуля Python datetime что бы ограничить множество по дате. Например:

limit_choices_to = {'pub_date__lte': datetime.now}

позволяет выбирать связанные объекты с pub_date до текущей даты.

Вместо словаря можете использовать объект Q для сложных запросов. Однако, если limit_choices_to объект Q, он будет использован в интерфейсе администратора только, если поле не находится в raw_id_fields класса ModelAdmin для этой модели.

ForeignKey.related_name

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

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

user = models.ForeignKey(User, related_name='+')
ForeignKey.to_field

Поле связанной модели, которое используется для создания связи между таблицами. По-умолчанию, Django использует первичный ключ.

Добавлено в Django 1.3.
ForeignKey.on_delete

Когда объект, на который ссылается ForeignKey, удаляется, Django по-умолчанию повторяет поведение ограничения ON DELETE CASCADE в SQL и удаляет объекты содержащие ForeignKey. Такое поведение может быть переопределено параметром on_delete. Например, если ваше поле ForeignKey может содержать NULL и вы хотите, что бы оно устанавливалось в NULL после удаления связанного объекта:

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

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

  • CASCADE: каскадное удаление, значение по-умолчанию.

  • PROTECT: препятствует удалению связанного объекта вызывая исключение django.db.models.ProtectedError`(подкласс :exc:`django.db.IntegrityError).

  • SET_NULL: устанавливает ForeignKey в NULL; возможно только если null равен True.

  • SET_DEFAULT: устанавливает ForeignKey в значение по-умолчанию; значение по-умолчанию должно быть указано для ForeignKey.

  • SET(): устанавливает ForeignKey в значение указанное в SET(). Если указан выполняемый объект, результат его выполнения. Вызываемый объект можно использовать, что бы избежать запросов во время импорта models.py:

    def get_sentinel_user():
        return User.objects.get_or_create(username='deleted')[0]
    
    class MyModel(models.Model):
        user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))
    
  • DO_NOTHING: ничего не делать. Если используемый тип базы данных следит за целостностью связей, будет вызвано исключение IntegrityError, за исключением, когда вы самостоятельно добавите SQL правило ON DELETE для поля таблицы (возможно используя загрузочный sql).

ManyToManyField

class ManyToManyField(othermodel[, **options])

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

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

Django самостоятельно создаст промежуточную таблицу для хранения связи многое-ко-многим. По-умолчанию, название этой таблицы создается из названия поля и связанной модели. Так как некоторые базы данных не поддерживают длинные названия таблиц, оно будет обрезано до 64 символов и будет добавлен уникальный хэш. Это означает что вы можете увидеть такие названия таблиц author_books_9cdf4; это нормально. Вы можете указать название промежуточной таблицы используя параметр db_table.

Параметры

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

ManyToManyField.related_name

Аналогично ForeignKey.related_name.

ManyToManyField.limit_choices_to

Аналогично ForeignKey.limit_choices_to.

limit_choices_to``не работает для ``ManyToManyField переопределенной через through промежуточной моделью.

ManyToManyField.symmetrical

Используется только при рекурсивной связи. Например, есть модель:

class Person(models.Model):
    friends = models.ManyToManyField("self")

Загружая эту модель Django определяет, что она содержит ManyToManyField указывающее на себя, и не добавляет атрибут person_set классу модели Person. Вместо этого подразумевается, что :class:`ManyToManyField`симметрично – то есть, если я твой друг, то и ты мне друг.

Если вам не нужна симметричность для связи многое-ко-многим к self, установите symmetrical в False. Это заставит Django добавить дескриптор для обратной связи позволяя ManyToManyField быть не симетричным.

ManyToManyField.through

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

Обычно используют для хранения дополнительных данных.

ManyToManyField.db_table

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

OneToOneField

class OneToOneField(othermodel[, parent_link=False, **options])

Связь один-к-одному. Работает так же, как и ForeignKey с unique=True, но “обратная” связь возвращает один объект.

В основном применяется как первичный ключ модели, которая “расширяет” другую модель. Например, Multi-table наследование работает через неявное добавление связи один-к-одному от дочерней модели к родительской.

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

Так же OneToOneField принимает все дополнительные параметры принимаемые ForeignKey, и еще один дополнительный:

При True и связанной модели, которая наследуется от другой модели, определяет, что должна сохраняться связь на родительскую модель, а не поле OneToOneField дочерней модели, которое используется для организации наследования моделей.