Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

2.10 Мета-классы
6 из 6 шагов пройдено

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 классе.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.