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

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

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

permissions

Параметр permissions в 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:
        permissions = [
            ('add_employee', 'Can add Employee'),
            ('delete_employee', 'Can delete Employee'),
        ]

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

Обратите внимание, что Django также определяет ряд разрешений по умолчанию для каждой модели, таких как viewchange и delete, которые автоматически создаются и управляются при создании модели. Этот permissions параметр используется для добавления дополнительных настраиваемых разрешений помимо этих значений по умолчанию.

 

default_permissions

Параметр default_permissions в Meta классе модели Django указывает набор разрешений по умолчанию, который будет создан для модели. Разрешения по умолчанию в Django включают addchange и delete.

По умолчанию Django создает эти разрешения для каждой модели в приложении. Однако вы можете установить default_permissions в [] классе Meta модели, чтобы отказаться от создания этих разрешений по умолчанию для этой модели.

Например, чтобы отказаться от разрешений по умолчанию для 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:
        default_permissions = []

С этим параметром при создании Employee модели разрешения по умолчанию создаваться не будут. Если вам по-прежнему необходимо предоставить разрешение определенным пользователям или группам для выполнения действий с экземплярами этой модели, вы можете использовать параметр permissions в Meta классе для определения настраиваемых разрешений.

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

default_permissions = ['add', 'change']

В этом примере для модели будут созданы только разрешения add и change по умолчанию. Разрешение delete не будет создано, так как оно не включено в default_permissions список.

 

proxy

Параметр proxy в Meta классе модели Django указывает, следует ли использовать модель в качестве прокси-модели. Прокси-модель — это модель, которая наследует все поля, методы и параметры от другой модели, но может рассматриваться как отдельная модель в Django ORM.

По умолчанию модель в Django не является прокси-моделью. Однако вы можете установить proxy в True классе Meta модели, чтобы сделать ее прокси-моделью.

Например, чтобы сделать 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)

    def __str__(self):
        return f'{self.first_name} {self.last_name}'


class LatestEmployee(Employee):
    class Meta:
        proxy = True
        ordering = ['-created']

В этом примере Employee модель определяет поля, методы и параметры, которые LatestEmployee унаследует прокси-модель. Модель LatestEmployee создается путем установки proxy в True ее Meta классе.

Модель LatestEmployee можно использовать так же, как и любую другую модель в Django ORM, но она обращается к тем же данным, которые хранятся в таблице для Employee модели. В этом примере LatestEmployee модель изменяет порядок данных по умолчанию по дате публикации в порядке убывания.

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

Несколько примеров ORM-запросов для моделей Employee и LatestEmployee из предыдущего примера:


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

Тут должно быть наоборот

@Марат_Асылбаев, спасибо, исправил.

Опечатка: По умолчанию Django создает эти разрешения по умолчанию для каждой модели в приложении

@Sergei_Aleshin, поправил, спасибо.