覆盖 Django Rest Framework 中的更新而不重新实现整个方法?

Mad*_*813 1 python django django-rest-framework

所以,我一直在寻找一种模式或标准一段时间,但我似乎找不到。

假设我有一些序列化器:

WhateverSerializer(serializers.ModelSerializer):
    class Meta:
      model = Whatever
      fields = (
           'special',
           'field_1',
           'field_2'
           #a bunch more...
      )
Run Code Online (Sandbox Code Playgroud)

我希望仅针对该字段special而不是其他字段有一些特殊的更新行为。有没有一种方法可以覆盖update 而不必像这样重做整个更新方法?

def update(self, instance, validated_data):
    special_behaviour(instance.special)
    instance.field_1 = validated_data.get('field_1', instance.field_1)
    instance.field_2 = validated_data.get('field_2', instance.field_2)
    #a bunch more...
Run Code Online (Sandbox Code Playgroud)

我尝试过调用该ModelViewSet.update方法,但它实际上采用的参数与您在视图集中覆盖的参数不同,并且我不确定如何准确地将我拥有的参数传递到该方法中。

bdo*_*leu 6

只需从已验证数据的字典中删除键,进行计算,然后使用 super 函数调用继承的更新方法来进行.save()更改。

def update(self, instance, validated_data):
    special = validated.data.pop('special')
    instance.special = perform_calc(special)
    return super().update(instance, validated_data)
Run Code Online (Sandbox Code Playgroud)