Django Rest框架:序列化程序上的共享字段
我有一些序列化程序,它们共享一些字段,比如meta\u id、category\u id等等 显然,我可以在序列化程序中将它们单独声明为SerializerMethodField,但我希望找到一种方法来重用逻辑,可以使用Mixin、Decorator或继承 我如何声明一个基序列化程序并继承它-同时仍然从serializers.ModelSerializer继承?这样我就可以重用get_meta_id并确保它显示在字段中Django Rest框架:序列化程序上的共享字段,django,django-models,django-rest-framework,django-views,Django,Django Models,Django Rest Framework,Django Views,我有一些序列化程序,它们共享一些字段,比如meta\u id、category\u id等等 显然,我可以在序列化程序中将它们单独声明为SerializerMethodField,但我希望找到一种方法来重用逻辑,可以使用Mixin、Decorator或继承 我如何声明一个基序列化程序并继承它-同时仍然从serializers.ModelSerializer继承?这样我就可以重用get_meta_id并确保它显示在字段中 class Foo(serializers.ModelSerializer,
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.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):#BaseSerializer类继承ModelSerializer的所有内容
Meta类(serializers.ModelSerializer.Meta):#BaseSerializer.Meta继承ModelSerializer.Meta的所有内容
def get_meta_id(自身,obj):
返回self.meta_id
类Foo(BaseSerializer):
meta_id=Serializers.SerializerMethodField()
class Meta(BaseSerializer.Meta):#这里您应该获得ModelSerializer.Meta+您的自定义get_Meta_id
model=Foo
字段=[…]
类BaseSerializer(serializers.ModelSerializer):#BaseSerializer类从ModelSerializer继承所有内容
Meta类(serializers.ModelSerializer.Meta):#BaseSerializer.Meta继承ModelSerializer.Meta的所有内容
def get_meta_id(自身,obj):
返回self.meta_id
类Foo(BaseSerializer):
meta_id=Serializers.SerializerMethodField()
class Meta(BaseSerializer.Meta):#这里您应该获得ModelSerializer.Meta+您的自定义get_Meta_id
model=Foo
字段=[…]
但在这种情况下,模型已经在baseserializer的元类中定义。我需要这对许多modelsOk起作用,我更新了我的答案,您可以将BaseSerializer定义为serializers.Serializer。但是通过这种方式,您必须将serializers.ModelSerializer添加到子序列化程序。但是在这种情况下,该模型已经在baseserializer的元类中定义。我需要这对许多modelsOk起作用,我更新了我的答案,您可以将BaseSerializer定义为serializers.Serializer。但通过这种方式,您必须将serializers.ModelSerializer添加到子序列化程序。您的meta\u id
字段是否为read\u
字段?还是读写字段?@ArakkalAbu这是一个只读字段——它来自另一个模型,这不是我的意思。公共字段是否仅用于序列化目的?是的,它们仅用于序列化。您的meta\u id
字段是否为read\u
字段?还是读写字段?@ArakkalAbu这是一个只读字段——它来自另一个模型,这不是我的意思。公共字段是否仅用于序列化目的?是的,它们仅用于序列化。