Параметры метаданных модели
В этом документе описаны все возможные параметры метаданных, которые вы можете указать для вашей модели во внутренних 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)]Упорядочивание по умолчанию также влияет на запросы агрегации, но это не будет так, начиная с Django 3.1.
Предупреждение
Упорядочивание не является бесплатной операцией. Каждое поле, которое вы добавляете в упорядочивание, влечёт затраты для вашей базы данных. Каждый внешний ключ будет неявно включать все свои настройки упорядочивания по умолчанию.
Если в запросе не указано упорядочивание, результаты возвращаются из базы данных в неопределенном порядке. Гарантируется конкретный порядок только тогда, когда упорядочивание выполняется по набору полей, которые однозначно идентифицируют каждый объект в результатах. Например, если поле 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 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 -
Новое в Django 2.2.
Список ограничений, которые вы хотите определить для модели:
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.0/ref/models/options/