Значения по умолчанию в свойстве модели на основе другого свойства в той же модели django
Я хочу отправлять значения по умолчанию, основанные на другом ключе в той же модели, и я использую Django с Postgres, например, если type = 'owner' || 'admin', то свойство can_edit должно быть true, иначе оно должно быть false.
models.py
class Type(models.Model):
name = models.CharField(max_length=255)
class Role(models.Model):
name = models.CharField(max_length=255)
type = models.ForeignKey(Type, on_delete=models.CASCADE, null=True)
can_edit = models.BooleanField(null=True)
serializers.py
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = ['id', 'name', 'type', 'can_edit']
views.py
@api_view(['POST', 'GET'])
def roles_handler(request):
if request.method == 'POST':
role = RoleSerializer(data=request.data)
role.is_valid(raise_exception=True)
role.save()
return Response({'data': role.data, 'success': True})
Вы можете использовать, например, сигнал pre_save
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save, sender=Role)
def validate_can_edit(sender, instance, *args, **kwargs):
if instance.type == something:
can_edit = True
как сказал Бартош Стасяк. Вы можете использовать сигнал pre_save, который вызывается перед сохранением данных в базу данных.
Сначала создайте новый файл signals.py в своей директории.
запишите следующим образом:
from django.db.models.signals import pre_save
from django.dispatch import receiver
from .app import Role #import your model here
@receiver(pre_save, sender=Role) # in sender you have to put the model where the pre_save function is called
def validate_can_edit(sender, instance, *args, **kwargs):
if instance.type.casefold() in ['owner', 'admin']: #checking if values are equal and convert the input value to lowercase to avoid case-sensitive issues.
instance.can_edit = True
else:
instance.can_edit = False
в вашем serializers.py удалите поле can_edit, так как оно вам больше не понадобится и будет присвоено функцией signal перед сохранением в базу данных.
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = ['id', 'name', 'type']
Вам необходимо переопределить метод сохранения в классе 'Role' в models.py Добавьте это в models.py под классом Role
def save(self, *args, **kwargs):
if self.type.name == 'owner' or self.type.name == 'admin':
self.can_edit = True
super(Role, self).save(*args, **kwargs)
Если вы хотите установить 'can_edit' в False, иначе отредактируйте строку
can_edit = models.BooleanField(null=True)
to
can_edit = models.BooleanField(default=False)