Параметры метаданных модели
В этом документе описаны все возможные параметры метаданных, которые вы можете указать для вашей модели во внутренних class Meta.
Доступные Meta параметры
abstract
-
Options.abstract -
Если
abstract = True, эта модель будет абстрактным базовым классом.
app_label
-
Options.app_label -
Если модель определена вне приложения в
INSTALLED_APPS, она должна объявить, к какому приложению она принадлежит:app_label = 'myapp'
Если вы хотите представить модель в формате
app_label.object_nameилиapp_label.model_name, вы можете использоватьmodel._meta.labelилиmodel._meta.label_lowerсоответственно.
base_manager_name
-
Options.base_manager_name -
Имя атрибута менеджера, например,
'objects', используемого для_base_managerмодели.
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 экранирует имена столбцов и таблиц за кулисами.
Используйте имена таблиц в нижнем регистре для MariaDB и MySQL
Рекомендуется использовать имена таблиц в нижнем регистре при переопределении имени таблицы через db_table, особенно если вы используете базу данных MySQL. Дополнительную информацию см. в Примечания к MySQL.
Обрамление имен таблиц для Oracle
Для соответствия ограничению Oracle в 30 символов для имен таблиц и обычным соглашениям для баз данных Oracle Django может укорачивать имена таблиц и переводить их в верхний регистр. Чтобы предотвратить такие преобразования, используйте обрамленное имя в качестве значения для db_table.
db_table = '"name_left_in_lowercase"'
Такие обрамленные имена также могут использоваться с другими поддерживаемыми базами данных Django; однако, за исключением Oracle, кавычки не имеют никакого эффекта. Дополнительную информацию см. в Примечания к Oracle.
db_tablespace
-
Options.db_tablespace -
Имя пространства таблиц базы данных для этой модели. По умолчанию используется значение настройки проекта
DEFAULT_TABLESPACE, если она задана. Если базовый механизм не поддерживает пространства таблиц, этот параметр игнорируется.
default_manager_name
-
Options.default_manager_name -
Имя менеджера для
_default_managerмодели.
default_related_name
get_latest_by
-
Options.get_latest_by -
Имя поля или список имён полей в модели, обычно
DateField,DateTimeFieldилиIntegerField. Это определяет поле(я) по умолчанию, используемые в методахManagerвашей моделиlatest()иearliest().Пример:
# Latest by ascending order_date. get_latest_by = "order_date" # Latest by priority descending, order_date ascending. get_latest_by = ['-priority', '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, on_delete=models.CASCADE) # ... 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']
Вы также можете использовать выражения запроса. Чтобы отсортировать по полю
authorпо возрастанию и расположить значения NULL в конце, используйте следующее:from django.db.models import F ordering = [F('author').asc(nulls_last=True)]
Предупреждение
Упорядочивание — это не бесплатная операция. Каждое поле, которое вы добавляете в порядок, влечет за собой затраты для вашей базы данных. Каждый внешний ключ, который вы добавляете, также неявно включает все его стандартные порядки сортировки.
Если в запросе нет указанного порядка, результаты возвращаются из базы данных в неопределённом порядке. Гарантируется конкретный порядок только при сортировке по набору полей, которые однозначно идентифицируют каждый объект в результатах. Например, если поле name не уникально, сортировка по нему не гарантирует, что объекты с одинаковым именем всегда будут отображаться в том же порядке.
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', 'view'). Вы можете настроить этот список, например, установив его в пустой список, если вашему приложению не требуются стандартные разрешения. Его необходимо указать в модели до создания модели с помощьюmigrate, чтобы предотвратить создание пропущенных разрешений.
proxy
-
Options.proxy -
Если
proxy = True, модель, которая наследуется от другой модели, будет обрабатываться как модель-прокси.
required_db_features
-
Options.required_db_features -
Список функций базы данных, которые должна иметь текущее подключение, чтобы модель учитывалась на этапе миграции. Например, если вы установите этот список в
['gis_enabled'], модель будет синхронизирована только в базах данных, поддерживающих географические данные. Это также полезно для пропуска некоторых моделей при тестировании с несколькими базами данных. Избегайте отношений между моделями, которые могут или могут не быть созданы, так как ORM не обрабатывает это.
required_db_vendor
-
Options.required_db_vendor -
Имя поддерживаемого поставщика баз данных, к которому относится эта модель. Текущие встроенные имена поставщиков:
sqlite,postgresql,mysql,oracle. Если этот атрибут не пустой, и текущий поставщик подключения не соответствует ему, модель не будет синхронизирована.
select_on_save
-
Options.select_on_save -
Определяет, будет ли Django использовать алгоритм
django.db.models.Model.save()до версии 1.6. Старый алгоритм используетSELECTдля определения наличия существующей строки, которую нужно обновить. Новый алгоритм пытается выполнитьUPDATEнапрямую. В некоторых редких случаяхUPDATEсуществующей строки не видна Django. Примером является триггер PostgreSQLON UPDATE, который возвращаетNULL. В таких случаях новый алгоритм будет выполнятьINSERTдаже при наличии строки в базе данных.Обычно нет необходимости устанавливать этот атрибут. Значение по умолчанию
False.См.
django.db.models.Model.save()для получения дополнительной информации о старом и новом алгоритмах сохранения.
indexes
-
Options.indexes -
Список индексов, которые вы хотите определить для модели:
from django.db import models class Customer(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) class Meta: indexes = [ models.Index(fields=['last_name', 'first_name']), models.Index(fields=['first_name'], name='first_name_idx'), ]
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"]
constraints
-
Options.constraints -
Список ограничений, которые вы хотите определить для модели:
from django.db import models class Customer(models.Model): age = models.IntegerField() class Meta: constraints = [ models.CheckConstraint(check=models.Q(age__gte=18), name='age_gte_18'), ]
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".
Только для чтения Meta атрибуты
label
-
Options.label -
Представление объекта, возвращает
app_label.object_name, например,'polls.Question'.
label_lower
-
Options.label_lower -
Представление модели, возвращает
app_label.model_name, например,'polls.question'.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.2/ref/models/options/