简体   繁体   English

在Django和DRF中控制模型创建

[英]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: 我建议重写CreateDiskSerializercreate方法,使其看起来像:

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.

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