考虑以下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
我正在尝试在模型创建时实现从free_space
初始化size
字段值的想法。
天真的方法会覆盖Disk.save()
,但这是我最后使用的方法。另一种方法是创建一个自定义模型管理器,它覆盖.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)
你觉得它可以接受吗?有更好的解决方案吗?
答案 0 :(得分:0)
我建议覆盖create
的{{1}}方法,如下所示:
CreateDiskSerializer