Django Rest框架:序列化程序上的共享字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django Rest框架:序列化程序上的共享字段相关的知识,希望对你有一定的参考价值。
我有一些序列化程序,它们共享一些字段,例如meta_id,category_id等。
显然,我可以在序列化器上将它们分别声明为SerializerMethodField,但是我想找到一种方法,可以通过Mixin,Decorator或继承来重用逻辑。
如何声明基本的序列化器并继承它,同时仍然继承于serializers.ModelSerializer?这样我就可以重用get_meta_id并确保它显示在字段中?
class Foo(serializers.ModelSerializer, somethingHere?):
meta_id = Serializers.SerializerMethodField()
class Meta:
model = Foo
fields = [...]
def get_meta_id(self, obj):
...
是否可以仅将两个参数传递给类
答案
您可以创建基本序列化程序,并为其他序列化程序使用继承。例如:
class BaseSerializer(serializers.Serializer):
#your codes and extra fields
test_field = serializer.SerializerMethodField()
def get_test_field(self.obj):
return 'test' # or you can use obj instance here
class ExtendedSerializer(BaseSerializer,serializers.ModelSerializer):
#your extra fields
class Meta:
fields = BaseSerializer.Meta.fields + () # you can add your additional fields here
另一答案
class BaseSerializer(serializers.ModelSerializer): # The BaseSerializer class inherit everthing from ModelSerializer
class Meta(serializers.ModelSerializer.Meta): # The BaseSerializer.Meta inherits everything from ModelSerializer.Meta
def get_meta_id(self, obj):
return self.meta_id
class Foo(BaseSerializer):
meta_id = Serializers.SerializerMethodField()
class Meta(BaseSerializer.Meta): # Here you should get the ModelSerializer.Meta + your custom get_meta_id
以上是关于Django Rest框架:序列化程序上的共享字段的主要内容,如果未能解决你的问题,请参考以下文章
Django Rest 框架 ListField 和 DictField
Django rest框架 - 模型序列化程序不会序列化所有字段
如何在 django rest 框架中为枚举字段创建序列化程序
将不在模型中的字段添加到 Django REST 框架中的序列化程序