[英]Controlling model creation in Django and DRF
Consider the following Django model and DRF-based API: 考虑以下Django模型和基于DRF的API:
class Disk(models.Model):
size = models.IntegerField(...)
free_space = models.IntegerField(...)
# ---- Serializers ---- #
class DiskSerializer(serializers.ModelSerializer):
class Meta:
model = Disk
fields = ('free_space', 'size')
read_only_fields = ('size', )
class CreateDiskSerializer(models.Model):
class Meta:
model = Disk
fields = ('size', ) # note, size only!
# ---- View ---- #
class DisksView(viewsets.ModelViewSet):
...
def get_serializer(self):
if self.request.method == 'POST':
return CreateDiskSerializer
else:
return DiskSerializer
I am trying to implement the idea of initializing the value of free_space
field from size
on model creation. 我正在尝试实现在模型创建时根据
size
初始化free_space
字段的值的想法。
The naive approach would be overriding Disk.save()
but that is something I would use at the very last resort. 天真的方法将覆盖
Disk.save()
但这是我最后使用的方法。 Another approach would be creating a custom model manager which overrides .create()
, eg: 另一种方法是创建一个覆盖
.create()
的自定义模型管理器,例如:
class DiskManager(models.Manager):
def create(self, **kwargs):
if 'free_space' not in kwargs:
try:
kwargs['free_space'] = kwargs['size']
except KeyError:
pass
return super().create(**kwargs)
Does it look acceptable to you? 看起来对您来说可以接受吗? Is there a better solution?
有更好的解决方案吗?
I would recommend overriding the create
method of CreateDiskSerializer
to look something like: 我建议重写
CreateDiskSerializer
的create
方法,使其看起来像:
def create(self, validated_data):
validated_data['free_space'] = validated_data['size']
return super(CreateDiskSerializer, self).create(validated_data)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.