简体   繁体   中英

Controlling model creation in Django and DRF

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM