Django Rest框架:序列化程序上的共享字段

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,

我有一些序列化程序,它们共享一些字段,比如meta\u id、category\u 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.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这是一个只读字段——它来自另一个模型,这不是我的意思。公共字段是否仅用于序列化目的?是的,它们仅用于序列化。