Параметры метаданных модели
В данном документе описаны все возможные параметры метаданных, которые вы можете указать для вашей модели в её внутреннем 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по возрастанию и размещения нулевых значений в конце используйте это: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'], модель будет синхронизироваться только на базах данных, поддерживающих GIS. Это также полезно для пропуска некоторых моделей при тестировании с несколькими базами данных. Избегайте отношений между моделями, которые могут или не могут быть созданы, так как 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 admin и применяется на уровне базы данных (т.е., соответствующие
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/4.1/ref/models/options/