В Django Meta параметр модели — это класс, предоставляющий дополнительные параметры модели. Класс Meta позволяет вам установить дополнительные параметры модели, такие как имя таблицы, порядок и подробное имя.
abstract
Параметр abstract в Meta классе модели Django — это логическое значение, которое указывает, является ли модель абстрактной или нет. Абстрактная модель — это модель, которая предназначена для подкласса других моделей, а не для непосредственного использования.
Когда модель помечена как абстрактная, ее нельзя создать, то есть вы не можете создавать экземпляры модели в своем коде. Однако поля и методы абстрактной модели могут использоваться другими моделями, унаследованными от нее.
Этот abstract параметр удобен для создания повторно используемых компонентов, которые можно использовать в нескольких моделях. Например, вы можете создать абстрактную модель, определяющую общие поля и методы для всех ваших моделей, а затем сделать так, чтобы каждая модель наследовала от абстрактной модели. Это упрощает поддержку вашего кода и гарантирует, что общие функции последовательно реализуются в ваших моделях.
Вот пример использования abstract опции в Meta классе модели Django:
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
age = models.SmallIntegerField(null=True)
created = models.DateTimeField(default=timezone.now)
work_experience = models.SmallIntegerField(default=0)
contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
department = models.ForeignKey(Department, on_delete=models.CASCADE, default=None)
compensations = models.ManyToManyField(Compensation)
class Meta:
abstract = True
class Trainee(Employee):
reviews = models.CharField(max_length=100)
В этом примере Employee определяется как абстрактная модель, а Trainee модель определяется как конкретная модель, наследуемая от Employee. Модель Trainee будет иметь доступ к полям first_name и last_name, определенным в Employee, а также к своим собственным полям, например reviews. Данный мета-класс мы рассмотрим более подробнее в разделе 2.11 данного курса.
app_label
Параметр app_label в Meta классе модели Django — это строка, указывающая имя приложения Django, которому принадлежит модель. Опция app_label используется Django ORM для определения таблицы базы данных, в которой должна храниться модель.
По умолчанию Django будет использовать имя модуля Python модели, чтобы определить имя приложения, которому принадлежит модель. Однако, если у вас есть несколько моделей в одном модуле и вы хотите разделить их на разные приложения или если вы хотите изменить поведение по умолчанию по какой-либо другой причине, вы можете использовать параметр app_label в Meta классе каждой модели. Также данную опцию удобно использовать, когда модель определена за пределами приложений в INSTALLED_APPS, то ей необходимо объявить, какому приложению она принадлежит.
Вот пример использования app_label опции в Meta классе модели Django:
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
age = models.SmallIntegerField(null=True)
created = models.DateTimeField(default=timezone.now)
work_experience = models.SmallIntegerField(default=0)
contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
department = models.ForeignKey(Department, on_delete=models.CASCADE, default=None)
compensations = models.ManyToManyField(Compensation)
class Meta:
app_label = 'hr'
В этом примере Employee модель связана с hr приложением, и ее данные будут храниться в таблице базы данных с именем hr_employee. Эта опция app_label особенно полезна, когда вы хотите повторно использовать одну и ту же модель в нескольких приложениях, поскольку она позволяет хранить данные для каждого приложения отдельно.
base_manager_name
Параметр base_manager_name в Meta классе модели Django представляет собой строку, указывающую имя менеджера по умолчанию для модели. Менеджер — это экземпляр django.db.models.Manager, который используется для взаимодействия с данными модели в базе данных.
По умолчанию Django создает менеджер с именем objects для каждой модели. Этот менеджер можно использовать для извлечения, создания, обновления и удаления экземпляров модели. Однако, если вы хотите использовать другое имя для менеджера по умолчанию, вы можете использовать опцию base_manager_name в Meta классе модели.
Вот пример использования base_manager_name опции в Meta классе модели Django:
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
age = models.SmallIntegerField(null=True)
created = models.DateTimeField(default=timezone.now)
work_experience = models.SmallIntegerField(default=0)
contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
department = models.ForeignKey(Department, on_delete=models.CASCADE, default=None)
compensations = models.ManyToManyField(Compensation)
class Meta:
base_manager_name = 'hr'
В этом примере менеджер по умолчанию для Employee модели будет называться hr, а не objects. Менеджеры мы подробно рассмотрим в разделе 2.12.
db_table
Параметр db_table в Meta классе модели Django представляет собой строку, указывающую имя таблицы базы данных, в которой должна храниться модель.
По умолчанию Django будет использовать имя модели в нижнем регистре с _(подчеркивание) между словами, чтобы определить имя таблицы базы данных. Например, Employee модель будет храниться в таблице базы данных с именем employee.
Однако, если вы хотите использовать другое имя для таблицы базы данных, вы можете использовать опцию db_table в Meta классе модели.
Вот пример использования db_table опции в Meta классе модели Django:
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
age = models.SmallIntegerField(null=True)
created = models.DateTimeField(default=timezone.now)
work_experience = models.SmallIntegerField(default=0)
contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
department = models.ForeignKey(Department, on_delete=models.CASCADE, default=None)
compensations = models.ManyToManyField(Compensation)
class Meta:
db_table = 'my_employee'
В этом примере Employee модель будет храниться в таблице базы данных с именем my_employee, а не employee. Обратите внимание, что изменение имени таблицы базы данных может иметь последствия для вашего кода, так как вам потребуется обновить все ссылки на имя таблицы в ваших представлениях, шаблонах и других частях вашего приложения.
Обычно рекомендуется придерживаться поведения по умолчанию и позволить Django определять имя таблицы базы данных, если у вас нет особой причины использовать другое имя. Это делает ваш код более читабельным и простым в обслуживании.