Параметры метаданных модели
В этом документе объясняются все возможные параметры метаданных, которые вы можете указать для вашей модели в ее внутреннем class Meta.
Доступные Meta параметры
abstract
-
Options.abstract -
Если
abstract = True, эта модель будет абстрактным базовым классом.
app_label
-
Options.app_label -
Если модель определена вне приложения в
INSTALLED_APPS, она должна указать, к какому приложению она принадлежит:app_label = 'myapp'
Новая возможность в Django 1.9.Если вы хотите представить модель в формате
app_label.object_nameилиapp_label.model_name, вы можете использоватьmodel._meta.labelилиmodel._meta.label_lowerсоответственно.
base_manager_name
-
Options.base_manager_name -
Новая возможность в Django 1.10.
Имя менеджера, используемого для
_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 экранирует имена столбцов и таблиц за кулисами.
Использование имён таблиц в нижнем регистре для MySQL
Сильно рекомендуется использовать имена таблиц в нижнем регистре при переопределении имени таблицы с помощью db_table, особенно если вы используете базу данных MySQL. Более подробную информацию см. в примечаниях по MySQL.
Обрамление имени таблицы для Oracle
Для того, чтобы соответствовать ограничению в 30 символов для имён таблиц в Oracle, и совпадать с обычными соглашениями для баз данных 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 -
Новая возможность в Django 1.10.
Имя менеджера, используемого для
_default_managerмодели.
default_related_name
get_latest_by
-
Options.get_latest_by -
Имя порядкового поля в модели, обычно
DateField,DateTimeFieldилиIntegerField. Это задаёт поле по умолчанию, используемое вManagerвашей модели дляlatest()иearliest()методов.Пример:
get_latest_by = "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']
Стандартный порядок сортировки также влияет на запросы агрегации.
Предупреждение
Сортировка — это не бесплатная операция. Каждое поле, которое вы добавляете в порядок сортировки, влечет за собой затраты на вашу базу данных. Каждый внешний ключ неявно включает в себя все его значения по умолчанию.
Если в запросе не указана сортировка, результаты возвращаются из базы данных в неуказанном порядке. Конкретный порядок гарантируется только при сортировке по набору полей, уникально идентифицирующих каждый объект в результатах. Например, если поле 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'). Вы можете настроить этот список, например, установив его в пустой список, если ваше приложение не требует каких-либо стандартных разрешений. Он должен быть указан в модели до ее создания методомmigrate, чтобы предотвратить создание пропущенных разрешений.
proxy
-
Options.proxy -
Если
proxy = True, модель, которая является подклассом другой модели, будет обрабатываться как модель-прокси.
required_db_features
-
Options.required_db_features -
Новое в Django 1.9.
Список функций базы данных, которые должна иметь текущее подключение, чтобы модель была рассмотрена на стадии миграции. Например, если вы установите этот список в
['gis_enabled'], модель будет синхронизироваться только на базах данных с поддержкой ГИС. Это также полезно для пропуска некоторых моделей при тестировании с несколькими бэкендами базы данных. Избегайте связей между моделями, которые могут или не могут быть созданы, так как ORM не обрабатывает это.
required_db_vendor
-
Options.required_db_vendor -
Новое в Django 1.9.
Имя поддерживаемого поставщика баз данных, специфическое для этой модели. Текущие встроенные имена поставщиков:
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()для получения дополнительной информации об старом и новом алгоритмах сохранения.
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"]
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 -
Новое в Django 1.9.
Представление объекта, возвращает
app_label.object_name, например'polls.Question'.
label_lower
-
Options.label_lower -
Новое в Django 1.9.
Представление модели, возвращает
app_label.model_name, например'polls.question'.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.10/ref/models/options/