控制Django和DRF中的模型创建

时间:2017-07-06 12:02:56

标签: python django django-models django-rest-framework

考虑以下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)

你觉得它可以接受吗?有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我建议覆盖create的{​​{1}}方法,如下所示:

CreateDiskSerializer