#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
которых не может иметь их
- Имя
- цвет [или]
- позиция обновлена. Можно изменить только поле разрешений. Есть ли какой-либо способ реализовать это в django?
Ответ №1:
Один из подходов заключается в добавлении метода сохранения для предотвращения сохранения модели, если роль не была определена. Например,
def save(self, *args, **kwargs):
if self.role:
super().save(*args, **kwargs)
else:
super().save(update_fields=['permissions',]