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 框架中的序列化程序

django rest 框架:从序列化器 validate() 方法设置字段级错误

如何在 Django REST 框架中更改字段名称