[英]Controlling model creation in Django and DRF
考慮以下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
我正在嘗試實現在模型創建時根據size
初始化free_space
字段的值的想法。
天真的方法將覆蓋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)
看起來對您來說可以接受嗎? 有更好的解決方案嗎?
我建議重寫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.