Параметры метаданных модели
В данном документе описываются все возможные параметры метаданных, которые вы можете указать для вашей модели в ее внутреннем 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_table_comment
-
Options.db_table_comment
Комментарий к таблице базы данных, используемой для этой модели. Это полезно для документирования таблиц базы данных для пользователей с прямым доступом к базе данных, которые могут не видеть ваш код Django. Например:
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
answer = models.TextField()
class Meta:
db_table_comment = "Question answers"
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 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"]
Устарело начиная с версии 4.2: Используйте опцию
indexesвместо этого.
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".
Постоянные атрибуты метаданных
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.2/ref/models/options/