Параметры метаданных модели
В этом документе объясняются все возможные параметры метаданных, которые вы можете указать для вашей модели в её внутренних class Meta.
Доступные Meta параметры
abstract
-
Options.abstract -
Если
abstract = True, эта модель будет являться абстрактным базовым классом.
app_label
-
Options.app_label -
Если модель существует вне стандартных расположений (
models.pyилиmodelsпакета в приложении), модель должна определить, к какому приложению она относится:app_label = 'myapp'
app_labelбольше не требуется для моделей, определённых вне модуляmodelsприложения.
db_table
-
Options.db_table -
Имя таблицы базы данных для модели:
db_table = 'music_album'
Имена таблиц
Для экономии времени Django автоматически выводит имя таблицы базы данных из имени вашего класса модели и приложения, в котором она находится. Имя таблицы базы данных модели строится путём соединения «метки приложения» модели — имени, которое вы использовали в manage.py startapp — с именем класса модели с подчёркиванием между ними.
Например, если у вас есть приложение bookstore (созданное с помощью manage.py startapp bookstore), модель, определённая как class Book будет иметь таблицу базы данных с именем bookstore_book.
Чтобы переопределить имя таблицы базы данных, используйте параметр db_table в class Meta.
Если имя вашей таблицы базы данных является SQL-зарезервированным словом или содержит символы, которые недопустимы в именах переменных Python — в частности, дефис — это нормально. Django экранирует имена столбцов и таблиц за кулисами.
Использование имён таблиц в нижнем регистре для MySQL
Настоятельно рекомендуется использовать имена таблиц в нижнем регистре при переопределении имени таблицы через db_table, особенно если вы используете бэкэнд MySQL. См. заметки о MySQL для получения более подробной информации.
Цитата имени таблицы для Oracle
Чтобы соответствовать ограничению в 30 символов для имён таблиц Oracle и соответствовать стандартным соглашениям для баз данных Oracle, Django может сокращать имена таблиц и преобразовывать их в верхний регистр. Чтобы предотвратить такие преобразования, используйте цитируемое имя в качестве значения для db_table:
db_table = '"name_left_in_lowercase"'
Такие цитируемые имена также могут быть использованы с другими поддерживаемыми бэкэндами баз данных Django; за исключением Oracle, однако, кавычки не имеют никакого эффекта. См. заметки об Oracle для получения более подробной информации.
db_tablespace
-
Options.db_tablespace -
Имя пространства таблиц базы данных для данной модели. По умолчанию используется значение настройки проекта
DEFAULT_TABLESPACE, если она задана. Если бэкэнд не поддерживает пространства таблиц, этот параметр игнорируется.
default_related_name
-
Имя, которое будет использоваться по умолчанию для связи от связанного объекта обратно к этому объекту. По умолчанию
<model_name>_set.Поскольку обратное имя поля должно быть уникальным, будьте внимательны, если вы намерены наследовать свою модель. Чтобы обойти коллизии имён, часть имени должна содержать
'%(app_label)s'и'%(model_name)s', которые заменяются соответственно именем приложения, к которому относится модель, и именем модели, оба в нижнем регистре. Смотрите абзац о именях связанных объектов для абстрактных моделей.
get_latest_by
-
Options.get_latest_by -
Имя упорядочиваемого поля в модели, обычно
DateField,DateTimeFieldилиIntegerField. Это указывает на поле по умолчанию, которое используется вManagerвашей модели для методовlatest()иearliest().Пример:
get_latest_by = "order_date"
См.
latest()для получения дополнительной информации.
managed
-
Options.managed -
По умолчанию
True, что означает, что Django создаст соответствующие таблицы базы данных вmigrateили в рамках миграций и удалит их в рамках команды управленияflush. То есть Django управляет жизненным циклом таблиц базы данных.Если
False, операции создания и удаления таблиц базы данных для этой модели не будут выполняться. Это полезно, если модель представляет собой существующую таблицу или представление базы данных, которое было создано другими средствами. Это единственное отличие приmanaged=False. Все другие аспекты обработки модели абсолютно такие же, как и обычно. Это включает- Добавление автоматического поля первичного ключа к модели, если вы его не объявляете. Чтобы избежать путаницы для читателей кода в будущем, рекомендуется указывать все столбцы из таблицы базы данных, которую вы моделируете, при использовании неуправляемых моделей.
-
Если модель с
managed=FalseсодержитManyToManyField, указывающий на другую неуправляемую модель, то промежуточная таблица для объединения многие-ко-многим также не будет создана. Однако промежуточная таблица между одной управляемой и одной неуправляемой моделью будет создана.Если вам нужно изменить это поведение по умолчанию, создайте промежуточную таблицу как отдельную модель (с
managedпо мере необходимости) и используйте атрибутManyToManyField.throughдля настройки связи с вашей настраиваемой моделью.
Для тестов, включающих модели с
managed=False, вам нужно обеспечить правильное создание таблиц в рамках настройки теста.Если вас интересует изменение поведения модели на уровне Python, вы можете использовать
managed=Falseи создать копию существующей модели. Однако есть лучший подход для этой ситуации: модели-прокси.
order_with_respect_to
-
Options.order_with_respect_to -
Делает этот объект упорядоченным по заданному полю, обычно
ForeignKey. Это может использоваться для упорядочивания связанных объектов по отношению к родительскому объекту. Например, еслиAnswerотносится к объектуQuestion, и вопрос имеет более одного ответа, а порядок ответов важен, вы сделаете это:from django.db import models class Question(models.Model): text = models.TextField() # ... class Answer(models.Model): question = models.ForeignKey(Question) # ... class Meta: order_with_respect_to = 'question'Когда
order_with_respect_toустановлено, предоставляются два дополнительных метода для получения и установки порядка связанных объектов:get_RELATED_order()иset_RELATED_order(), гдеRELATED— это имя модели в нижнем регистре. Например, если у объектаQuestionесть несколько связанных объектовAnswer, список содержит первичные ключи связанных объектовAnswer:>>> question = Question.objects.get(id=1) >>> question.get_answer_order() [1, 2, 3]
Порядок связанных объектов
QuestionобъектаAnswerможно установить, передав список первичных ключейAnswer:>>> question.set_answer_order([3, 1, 2])
Связанные объекты также получают два метода
get_next_in_order()иget_previous_in_order(), которые можно использовать для доступа к этим объектам в правильном порядке. Предполагая, что объектыAnswerупорядочены по полюid:>>> answer = Answer.objects.get(id=2) >>> answer.get_next_in_order() <Answer: 3> >>> answer.get_previous_in_order() <Answer: 1>
order_with_respect_to неявно задает параметр ordering
Внутренне, order_with_respect_to добавляет дополнительное поле/столбец базы данных с именем _order и устанавливает параметр модели ordering в это поле. Следовательно, order_with_respect_to и ordering не могут быть использованы вместе, и упорядочивание, добавленное order_with_respect_to будет применяться всякий раз, когда вы получаете список объектов этой модели.
Изменение порядка order_with_respect_to
Поскольку order_with_respect_to добавляет новый столбец в базу данных, обязательно создайте и примените соответствующие миграции, если вы добавите или измените order_with_respect_to после вашей начальной migrate.
ordering
-
Options.ordering -
Стандартный порядок сортировки объектов при получении списков объектов:
ordering = ['-order_date']
Это кортеж или список строк. Каждая строка — имя поля с необязательным префиксом «-», указывающим на убывание. Поля без ведущего «-» будут отсортированы по возрастанию. Используйте строку «?» для случайной сортировки.
Например, чтобы отсортировать по полю
pub_dateпо возрастанию, используйте:ordering = ['pub_date']
Чтобы отсортировать по полю
pub_dateпо убыванию, используйте:ordering = ['-pub_date']
Чтобы отсортировать по полю
pub_dateпо убыванию, а затем по полюauthorпо возрастанию, используйте:ordering = ['-pub_date', 'author']
Предупреждение
Сортировка — это не бесплатная операция. Каждое поле, добавленное в порядок сортировки, влечёт затраты для вашей базы данных. Каждый внешний ключ будет неявно включать и все свои стандартные порядки сортировки.
permissions
-
Options.permissions -
Дополнительные разрешения, которые необходимо ввести в таблицу разрешений при создании этого объекта. Разрешения на добавление, удаление и изменение создаются автоматически для каждой модели. Этот пример указывает дополнительное разрешение,
can_deliver_pizzas:permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)Это список или кортеж из 2-х кортежей в формате
(permission_code, human_readable_permission_name).
default_permissions
-
Options.default_permissions -
По умолчанию
('add', 'change', 'delete'). Вы можете настроить этот список, например, установив его в пустой список, если ваше приложение не требует каких-либо стандартных разрешений. Он должен быть указан в модели перед её созданием с помощьюmigrate, чтобы предотвратить создание пропущенных разрешений.
proxy
-
Options.proxy -
Если
proxy = True, модель, которая является подклассом другой модели, будет обрабатываться как модель-прокси.
select_on_save
-
Options.select_on_save -
Определяет, будет ли Django использовать алгоритм сохранения pre-1.6
django.db.models.Model.save(). Старый алгоритм используетSELECTдля определения, существует ли существующая строка для обновления. Новый алгоритм пытается выполнитьUPDATEнепосредственно. В некоторых редких случаяхUPDATEсуществующей строки не видна Django. Примером является триггер PostgreSQLON UPDATE, который возвращаетNULL. В таких случаях новый алгоритм в конечном итоге выполнитINSERTдаже если строка существует в базе данных.Обычно нет необходимости устанавливать этот атрибут. По умолчанию
False.См.
django.db.models.Model.save()для получения дополнительной информации об алгоритме сохранения старой и новой версии.
unique_together
-
Options.unique_together -
Наборы имён полей, которые вместе должны быть уникальными:
unique_together = (("driver", "restaurant"),)Это кортеж кортежей, которые должны быть уникальными при рассмотрении вместе. Он используется в Django админ-панели и навязывается на уровне базы данных (т.е., соответствующие
UNIQUEутверждения включены вCREATE TABLEутверждение).Для удобства, unique_together может быть одним кортежем при работе с одним набором полей:
unique_together = ("driver", "restaurant")ManyToManyFieldне может быть включён в unique_together. (Непонятно, что это вообще значит!) Если вам нужно проверить уникальность, связанную сManyToManyField, попробуйте использовать сигнал или явнуюthroughмодель.Ошибка
ValidationError, возникающая при проверке модели, когда ограничение нарушено, имеет код ошибкиunique_together.
index_together
-
Options.index_together -
Наборы имён полей, которые вместе индексируются:
index_together = [ ["pub_date", "deadline"], ]Этот список полей будет индексирован вместе (т.е. будет выдан соответствующий
CREATE INDEXоператор).Для удобства,
index_togetherможет быть одним списком при работе с одним набором полей:index_together = ["pub_date", "deadline"]
verbose_name
-
Options.verbose_name -
Человекопонятное имя объекта, единственное число:
verbose_name = "pizza"
Если это не задано, Django будет использовать модифицированную версию имени класса:
CamelCaseпревратится вcamel case.
verbose_name_plural
-
Options.verbose_name_plural -
Множественное число имени объекта:
verbose_name_plural = "stories"
Если это не задано, Django будет использовать
verbose_name+"s".
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/ref/models/options/