Consider the following Django model and DRF-based 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.
The naive approach would be overriding Disk.save()
but that is something I would use at the very last resort. Another approach would be creating a custom model manager which overrides .create()
, eg:
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:
def create(self, validated_data):
validated_data['free_space'] = validated_data['size']
return super(CreateDiskSerializer, self).create(validated_data)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.