是否可以从继承的序列化程序重写SerializerMethodField?
例如
# serializers.py
class BaseSerializer(serializers.ModelSerializer):
custom = serializers.SerializerMethodField()
class Meta:
model = Item
fields = ["pk", "custom"]
def get_custom(self, obj):
return "Base";
class ExtendedSerializer(BaseSerializer):
custom = serializers.SerializerMethodField()
class Meta:
model = Item
fields = ["pk", "custom"]
def get_custom(self, obj):
return "Extended";
显然,上面的代码不起作用。
我目前不得不创建另一个序列化程序,并为继承的序列化程序声明一个新的SerializerMethodField:
# serializers.py
class DefaultSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ["pk"]
class BaseSerializer(DefaultSerializer):
custom = serializers.SerializerMethodField()
class Meta:
model = Item
fields = ["pk", "custom"]
def get_custom(self, obj):
return "Base";
class ExtendedSerializer(DefaultSerializer):
custom = serializers.SerializerMethodField()
class Meta:
model = Item
fields = ["pk", "custom"]
def get_custom(self, obj):
return "Extended";
但是,如果我可以像在我的第一个代码块中那样重写现有的SerializerMethodField,那么对我的用例来说会更整洁。
事实上,您提出的解决方案是有效的,并且可以进一步最小化为:
from rest_framework import serializers
class DefaultSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ['pk']
class BaseSerializer(DefaultSerializer):
custom = serializers.SerializerMethodField()
class Meta:
model = Item
fields = ['pk', 'custom']
defget_custom(self, obj):
return 'Base'
class ExtendedSerializer(BaseSerializer):
defget_custom(self, obj):
return 'Extended'
因此,您需要在BaseSerializer
中将custom
字段作为SerializerMethodField
仅一次。通过简单地覆盖get_custom
的实现,它将生成数据,其中custom
密钥是'Base'
(如果由BaseSerializer
序列化),而'Extended'
(如果由ExtendedSerializer
序列化)。
事实上,如果我们序列化实例,我们得到:
>>> BaseSerializer(Item.objects.first()).data
{'pk': 1, 'custom': 'Base'}
>>> ExtendedSerializer(Item.objects.first()).data
{'pk': 1, 'custom': 'Extended'}