是否可以为继承的序列化程序重写SerializerMethodField



是否可以从继承的序列化程序重写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'}

相关内容

最新更新