django предотвращает обновление моделей на основе условий

#django #django-models

#django #django-модели

Вопрос:

У меня есть модель django, структурированная следующим образом.

 class Role(models.Model):
    """
    Represents a Global-Role object.
    Roles have their own:
        - Hex Color Code [Integer Representation]
        - Name [amp;]
        - Position
        - Permissions.
    A null positional value indicates a default role.
    As of now, clusters only have a single default role [@everyone].
    """

    class Meta:
        ordering = ['position', 'cluster']
        required_db_features = {
            'supports_deferrable_unique_constraints',
        }
        constraints = [
            models.UniqueConstraint(
                fields=['position', 'cluster'],
                name='deferrable_unique_role_position',
                deferrable=models.Deferrable.DEFERRED
            ),
            models.UniqueConstraint(
                fields=['id', 'cluster'],
                name='relatively_unique_role_id'
            )
        ]

    # cluster and id must both be primary key
    # to make sure the endpoints make sense
    objects = api_managers.RolesManager()
    id = models.BigAutoField(primary_key=True, db_index=True, editable=False, auto_created=True)
    permissions = BitField(flags=permission_flags, default=default_perm_flags, db_index=True)
    position = models.PositiveSmallIntegerField(null=True, blank=True, db_index=True, editable=True)
    name = models.CharField(max_length=100, validators=[MinLengthValidator(2)], db_index=True, default='new role')
    color = ColorField(db_index=True, default='#969696')
    cluster = models.ForeignKey('api_backend.DataSheetsCluster', on_delete=models.CASCADE, editable=False)
    created_at = models.DateTimeField(auto_now=True, editable=False, db_index=True)

    REQUIRED_FIELDS = [name, cluster]
 

Я хочу убедиться, что Role объекты, позиция NONE которых не может иметь их

  1. Имя
  2. цвет [или]
  3. позиция обновлена. Можно изменить только поле разрешений. Есть ли какой-либо способ реализовать это в django?

Ответ №1:

Один из подходов заключается в добавлении метода сохранения для предотвращения сохранения модели, если роль не была определена. Например,

     def save(self, *args, **kwargs):

        if self.role:

            super().save(*args, **kwargs)

        else:
            super().save(update_fields=['permissions',]