managed
Параметр managed в Meta классе модели Django указывает, должен ли Django управлять созданием и удалением таблиц базы данных для этой модели.
По умолчанию managed установлено значение True, что означает, что Django создаст таблицу базы данных для модели при запуске команды migrate и удалит таблицу при запуске makemigrations команды с --empty параметром.
Однако, если вы установите managed значение False, Django не создаст и не удалит таблицу базы данных для этой модели. Это полезно в ситуациях, когда вы хотите самостоятельно управлять таблицей базы данных для этой модели, например, когда вы используете пользовательскую серверную часть базы данных, которая не поддерживает ORM Django.
Вот пример модели с managed установленным значением False:
class CustomModel(models.Model):
# Fields
class Meta:
managed = False
Обратите внимание, что установка managed также False означает, что вы не сможете использовать Django ORM для выполнения операций с таблицей базы данных, таких как создание или обновление записей. Вам нужно будет выполнить эти операции напрямую, используя SQL или другой метод.
order_with_respect_to
Параметр order_with_respect_to в Meta классе модели Django указывает внешний ключ к другой модели. Порядок экземпляров модели по отношению к связанной модели сохраняется.
Например, если у вас есть Employee модель и Department модель, и каждый Employee экземпляр связан с одним Department экземпляром, вы можете указать order_with_respect_to в Meta классе модели Employee, чтобы указать, что порядок Employee экземпляров должен основываться на их связи с Department экземплярами:
class Department(models.Model):
name = models.CharField(max_length=255)
description = models.TextField(null=True, blank=True)
def __str__(self):
return self.name
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:
order_with_respect_to = 'department'
def __str__(self):
return f'{self.first_name} {self.last_name}'
Когда установлен order_with_respect_to, предусмотрены два дополнительных метода для извлечения и установки порядка связанных объектов: get_RELATED_order() и set_RELATED_order(), где RELATED - это имя модели в нижнем регистре.
Например, если предположить, что объект Department имеет несколько связанных объектов Employee, возвращаемый список содержит первичные ключи связанных объектов Employee:
Связанные объекты также получают два метода get_next_in_order() и get_previous_in_order(), которые можно использовать для доступа к этим объектам в правильном порядке.
Внутри order_with_respect_to добавляет дополнительное поле/столбец базы данных с именем _order и устанавливает для этого поля параметр ordering модели. Следовательно, order_with_respect_to и ordering не могут использоваться вместе, и порядок, добавленный order_with_respect_to, будет применяться всякий раз, когда вы получаете список объектов этой модели.
Более подробно вы можете почитать в документации - https://docs.djangoproject.com/en/4.2/ref/models/options/#order-with-respect-to
ordering
Параметр ordering в Meta классе модели Django указывает порядок по умолчанию для наборов запросов этой модели. Порядок определяется как список имен полей с необязательным '-' префиксом для указания убывающего порядка.
Например, чтобы упорядочить набор запросов Employee экземпляров по дате их создания в порядке убывания, вы можете указать в классе следующее Meta:
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:
ordering = ['-created']
С этим параметром, когда вы извлекаете набор запросов Employee экземпляров, они будут упорядочены по created полю в порядке убывания:
Вы можете переопределить порядок по умолчанию при получении набора запросов с помощью order_by метода:
Обратите внимание, что этот ordering параметр влияет только на порядок по умолчанию для наборов запросов. Чтобы сохранить порядок на основе связанной модели, вы можете использовать order_with_respect_to опцию в Meta классе.