web-dev-qa-db-ja.com

シリアライザ出力からフィールドを動的に削除する方法

Django RestフレームワークでAPIを開発しています。フィールドをシリアライザから動的に削除したいのですが、別のフィールドの値に応じてフィールドを削除する必要があるという問題があります。どうすればよいですか?次のようなシリアライザを持っています。

class DynamicSerliazer(serializers.ModelSerializer):
    type = serializers.SerializerMethodField()
    url = serializers.SerializerMethodField()
    title = serializers.SerializerMethodField()
    elements = serializers.SerializerMethodField()

    def __init__(self, *args, **kwargs):
        super(DynamicSerliazer, self).__init__(*args, **kwargs)
        if self.fields and is_mobile_platform(self.context.get('request', None)) and "url" in self.fields:
            self.fields.pop("url")

ご覧のとおり、リクエストがモバイルプラットフォームから行われたかどうかに応じて、「url」フィールドはすでに削除しています。しかし、「type」の値に応じて「elements」フィールドを削除したいと思います。どうすればいいですか?

前もって感謝します

19
FVod

can シリアライゼーションの動作をカスタマイズする シリアライザでto_representation() methodをオーバーライドする。

class DynamicSerliazer(serializers.ModelSerializer):

    def to_representation(self, obj):
        # get the original representation
        ret = super(DynamicSerializer, self).to_representation(obj)

        # remove 'url' field if mobile request
        if is_mobile_platform(self.context.get('request', None)):
            ret.pop('url')

        # here write the logic to check whether `elements` field is to be removed 
        # pop 'elements' from 'ret' if condition is True

        # return the modified representation
        return ret 
20
Rahul Gupta

複数のシリアライザーを作成し、ビューから適切なものを選択できます

class IndexView(APIView):
    def get_serializer(self):
        if self.request.GET['flag']:
            return SerializerA
        return SerializerB

継承を使用してシリアライザをDRYにします。

4
glmvrml

私の問題はあなたの問題と幾分似ていて、継承で解決しました。

class StaticSerializer(serializers.ModelSerializer):

    class Meta:
        model = StaticModel
        fields = (
            'first_name', 'last_name', 'password', 'username',
            'email'
        )


class DynamicSerializer(StaticSerializer):

    class Meta:
        model = StaticModel
        fields = (
            'first_name',
        )
1
spedy