Параметры модели¶
Этот раздел описывает все возможные настройки модели которые вы можете определить через 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соответственно.
verbose_name¶
- Options.base_manager_name¶
Имя атрибута менеджера, например
'objects', для использования в_base_managerмодели.
db_table¶
- Options.db_table¶
Название таблицы в базе данных для этой модели:
db_table = "music_album"
Название таблицы¶
Экономя ваше время, Django автоматически создаст название таблицы из названия модели и приложения. Название таблицы состоит из названия приложения(«app label») – название используемое для команды 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
Т.к в Oracle есть ограничение в 30 символов на название таблиц, и для соблюдения соглашений работы с Oracle, Django может ограничить название таблицы и преобразовать его в верхний регистр. Чтобы избежать этого, укажите название в кавычках в настройке db_table:
db_table = '"name_left_in_lowercase"'
Кавычки можно использовать для других типов базы данных, не только 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¶
Имя “tablespace” базы данных для этой модели. По умолчанию используется настройка
DEFAULT_TABLESPACE, если она определена. Если база данных не поддерживает “tablespace” для индексов, этот параметр будет проигнорирован.
default_related_name¶
- Options.default_manager_name¶
Имя менеджера, который будет использоваться для
_default_managerмодели.
get_latest_by¶
- Options.get_latest_by¶
Название сортируемого поля модели, обычно
DateField,DateTimeFieldилиIntegerField. Определяет поле по умолчанию, которое будет использовано методамиlatest()иearliest()Manager-а модели.Например:
# 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`.
Если модель с
managed=FalseсодержитManyToManyFieldна другую неуправляемую модель, промежуточная таблица для хранения связи многое-ко-многим не будет создана. Однако, промежуточная таблица между управляемой и не управляемой моделью будет создана.Если вы хотите переопределить такое поведение по умолчанию, создайте модель для промежуточной таблицы (с необходимым
managed) и укажите использование этой модели через параметрManyToManyField.through.
Правильное создание таблиц при тестировании в тестовой базе данных для модели с
managed=Falseложится на ваши плечи.Если вы хотите переопределить поведение модели на уровне Python, вы можете использовать
managed=Falseи создать копию существующей модели. Однако, есть лучшее решение для такой ситуации: Proxy-модели.
order_with_respect_to¶
- Options.order_with_respect_to¶
Объекты модели будут отсортированы относительно указанного поля. Почти всегда используется для
ForeignKey. Можно использовать для сортировки связанных объектов по значению из родительского объекта. Например, модельAnswer``(ответ) связана с моделью ``Question``(вопрос) через ``ForeignKey, вопрос содержит несколько ответов и порядок этих ответов имеет значение: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 = Question.objects.get(id=1) >>> question.get_answer_order() [1, 2, 3]
Порядок связанных с объектом «Вопрос» объектов «Ответ» можно установить, передав список первичных ключей «Ответ»:
>>> question.set_answer_order([3, 1, 2])
Связанные объекты также получают два метода: get_next_in_order() и get_previous_in_order(), которые можно использовать для доступа к этим объектам в их правильном порядке. Предполагая, что объекты Answer отсортированы по идентификатору:
>>> 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, не забудьте создать и применить миграцию, если вы добавите или поменяете 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"]
Вы также можете использовать выражения запроса. Чтобы упорядочить по возрастанию
автораи сделать нулевые значения сортируемыми последними, используйте следующее:from django.db.models import F ordering = [F("author").asc(nulls_last=True)]
Предупреждение
Сортировка не бесплатная операция. Каждое поле влияет на скорость выполнения запроса. Каждый внешний ключ добавит сортировку по умолчанию связанной модели.
Если в запросе не указан порядок, результаты возвращаются из базы данных в неопределенном порядке. Определенный порядок гарантируется только при упорядочивании по набору полей, которые однозначно идентифицируют каждый объект в результатах. Например, если поле name не уникально, упорядочение по нему не гарантирует, что объекты с одинаковым именем всегда будут отображаться в одном и том же порядке.
permissions¶
- Options.permissions¶
Дополнительные разрешения(permissions) будут добавлены в таблицу разрешений при создании модели. Разрешения на добавление, удаление и изменение автоматически создаются для каждой модели. Этот пример добавляет разрешение
can_deliver_pizzas:permissions = [("can_deliver_pizzas", "Can deliver pizzas")]
Это список 2-х элементных кортежей в формате
(код разрешения, название разрешения).
default_permissions¶
proxy¶
- Options.proxy¶
При
proxy = True, модель унаследованная от другой модели будет создана как proxy-модель.
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¶
Указывает использовать ли старый(до 1.6) алгоритм работы
django.db.models.Model.save(). Старый алгоритм использовалSELECTдля определения существует ли запись для обновления. Новый алгоритм сразу пробует обновить запись черезUPDATE. В некоторых редких случаяхUPDATEсуществующей записи не виден для Django. Например, в PostgreSQL срабатываниеON UPDATEвозвращаетNULL. В таких случаях новый алгоритм в конце концов попытается выполнитьINSERT, даже если запись существует в базе данных.Обычно нет надобности менять эту настройку. По умолчанию равно
False.Различия работы старого и нового алгоритмов смотрите в описании метода
django.db.models.Model.save().
index_together¶
- 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"]]
Кортеж кортежей полей, которые должны быть вместе уникальны. Используется в интерфейсе администратора для проверки данных и на уровне базы данных (то есть соответствующее определение
UNIQUEбудет добавлено вCREATE TABLEзапрос).Для удобства
index_togetherможет быть одноуровневым списком, если определяется один набор полей:unique_together = ["driver", "restaurant"]
ManyToManyFieldне может быть включен вunique_together. (Непонятно, что это вообще означает!) Если вам нужно проверить уникальность, связанную сManyToManyField, попробуйте использовать сигнал или явную модельthrough.Будет вызвано исключение
ValidationErrorв процессе проверки модели, если проверка ограничений(constraint) вернула ошибку с кодомunique_together.
abstract¶
- Options.constraints¶
Список ограничений, которые вы хотите определить в модели:
from django.db import models class Customer(models.Model): age = models.IntegerField() class Meta: constraints = [ models.CheckConstraint(condition=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'.