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

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

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

db_tablespace

Параметр db_tablespace в Meta классе модели Django представляет собой строку, указывающую имя табличного пространства базы данных, в котором должна храниться таблица базы данных модели.

Табличное пространство — это место на диске, где база данных хранит свои данные. По умолчанию Django будет использовать табличное пространство по умолчанию для базы данных для хранения данных модели. Однако, если вы хотите использовать другое табличное пространство, вы можете использовать опцию db_tablespace в Meta классе модели.

Вот пример использования db_tablespace опции в 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_tablespace = 'my_tablespace'

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

Использование табличных пространств может зависеть от базы данных, и этот db_tablespace параметр может быть недоступен или иметь какое-либо влияние на все базы данных. Вам следует обратиться к документации вашей базы данных для получения дополнительной информации об использовании табличных пространств.

 

default_manager_name

Параметр default_manager_name в Meta классе модели Django представляет собой строку, указывающую имя менеджера по умолчанию для модели.

Менеджер — это интерфейс к базе данных, который позволяет выполнять запросы к базе данных и другие операции с моделью. Django поставляется с менеджером по умолчанию для каждой модели с именем objects. Вы также можете создать собственные менеджеры для модели и указать, какой менеджер должен использоваться по умолчанию для модели, используя параметр default_manager_name в Meta классе.

Вот пример использования default_manager_name опции в Meta классе модели Django:

class Departments_it(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(department=1)


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)
    objects = models.Manager()
    departments_it = Departments_it()

    class Meta:
        default_manager_name = 'departments_it'

Модель сотрудников имеет два объекта-менеджера. Теперь, если мы вызовем Employee.objects.all(), мы получим всех сотрудников. Но при вызове Employee.departments_it.all() мы получим только те объекты, у кого департамент c id = 1 (В моем случае это "IT")

Вот пример того, как вы можете использовать менеджер по умолчанию в запросе ORM (Object-Relational Mapping) в Django:

Обратите внимание, что если вы используете несколько объектов-менеджеров в одной модели, вам нужно быть осторожным с порядком определения объектов-менеджеров. Первый определенный объект менеджера будет рассматриваться как объект менеджера по умолчанию. Например, в приведенном выше примере, objects не является менеджером по умолчанию, даже если он определен первым. Так как с помощью параметра default_manager_name мы это переопределили.  Django использует менеджеры по умолчанию в некоторых внутренних процессах. Поэтому будьте осторожны при выборе менеджера по умолчанию, иначе вы можете получить неожиданные результаты.  

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

 

default_related_name

Параметр default_related_name в Meta классе модели Django указывает имя обратной связи от связанных объектов обратно к модели.

Например, у нас есть Employee модель и Department модель, и каждая из них Employee связана с одним Department, вы можете определить отношение, используя ForeignKey поле в Employee модели:

class Department(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField(null=True, blank=True)


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)

По умолчанию Django создаст обратное отношение с именем employee_set. Это позволяет вам получить доступ к связанным Employee объектам из Department объекта:

Однако вы можете изменить имя обратного отношения, используя опцию default_related_name в Meta классе:

class Employee(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    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:
        default_related_name = '+'

В этом примере default_related_name для параметра установлено значение '+', что означает, что имя обратного отношения создано не будет.

Вы также можете установить default_related_name пользовательскую строку, чтобы указать имя обратной связи. Например:

    class Meta:
        default_related_name = 'employee_of_department'

С этой настройкой обратное отношение будет называться employee_of_department:

 

get_latest_by

Параметр get_latest_by в Meta классе модели Django указывает имя поля, используемого для определения самого последнего экземпляра модели.

Например, у нас есть Employee модель с created полем, вы можете указать get_latest_by в Meta классе, чтобы указать, что самым последним Employee экземпляром является экземпляр с последним created:

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:
        get_latest_by = 'created'

С этим параметром вы можете использовать latest() метод для набора запросов Employee экземпляров, чтобы получить самый последний Employee экземпляр:

Employee.objects.latest()

Обратите внимание, что это get_latest_by влияет только на latest() метод, а не на другие методы набора запросов, такие как order_by(). Если вы хотите заказать набор запросов по другому полю, вы можете использовать order_by() метод:

Employee.objects.order_by('-created')

Вы также можете указать несколько полей в get_latest_by, и в этом случае Django будет использовать первое поле, имеющее ненулевое значение, для определения самого последнего экземпляра.


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