Django Rest Framework: общие поля на сериализаторах - PullRequest
1 голос
/ 23 февраля 2020

У меня есть несколько сериализаторов, которые имеют несколько полей, таких как meta_id, category_id и т. Д.

Очевидно, я мог бы просто объявить их на сериализаторе как SerializerMethodField индивидуально, но я хотел бы найти способ для повторного использования logi c, либо с 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):
        ...

Можно ли просто передать два параметра в класс

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020
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
        model = Foo
        fields = [...]
0 голосов
/ 23 февраля 2020

Вы можете создать базовый сериализатор и использовать наследование для других сериализаторов. Например:

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
...