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

问题描述 投票:1回答:2

我有一些序列化程序,它们共享一些字段,例如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):
        ...

是否可以仅将两个参数传递给类

django django-models django-rest-framework django-views
2个回答
0
投票

您可以创建基本序列化程序,并为其他序列化程序使用继承。例如:

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

0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.