模型 属性 中的默认值基于同一模型 django 中的另一个 属性
Default values in model property based on another property in the same model 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.name == 'admin':
can_edit = True
但我想提出不同的解决方案。
将 can_edit 标志移至类型模型,如下所示:
class Type(models.Model):
name = models.CharField(max_length=255)
can_edit = models.BooleanField(null=True)
class Role(models.Model):
name = models.CharField(max_length=255)
type = models.ForeignKey(Type, on_delete=models.CASCADE, null=True)
通过这种方式,您可以使用 type.can_edit
访问 can_edit
标志,并且在将 Type 重命名为不同的名称(例如从 admin
到 Admin
正如 Bartosz Stasiak 所说。您可以使用在将数据保存到数据库之前调用的 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 字段,因为您将不再需要它,并且将在保存到数据库之前由信号函数分配。
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = ['id', 'name', 'type']
您需要在 models.py 'Role' class 上覆盖保存方法
在 class 角色
下的 models.py 中添加
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)
至
can_edit = models.BooleanField(default=False)
我想根据同一模型中的另一个键发送默认值,并且我将 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.name == 'admin':
can_edit = True
但我想提出不同的解决方案。 将 can_edit 标志移至类型模型,如下所示:
class Type(models.Model):
name = models.CharField(max_length=255)
can_edit = models.BooleanField(null=True)
class Role(models.Model):
name = models.CharField(max_length=255)
type = models.ForeignKey(Type, on_delete=models.CASCADE, null=True)
通过这种方式,您可以使用 type.can_edit
访问 can_edit
标志,并且在将 Type 重命名为不同的名称(例如从 admin
到 Admin
正如 Bartosz Stasiak 所说。您可以使用在将数据保存到数据库之前调用的 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 字段,因为您将不再需要它,并且将在保存到数据库之前由信号函数分配。
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = ['id', 'name', 'type']
您需要在 models.py 'Role' class 上覆盖保存方法 在 class 角色
下的 models.py 中添加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)
至
can_edit = models.BooleanField(default=False)