web-dev-qa-db-fra.com

Comment supprimer dynamiquement des champs de la sortie du sérialiseur

Je développe une API avec la structure Django Rest et je souhaite supprimer dynamiquement les champs d'un sérialiseur. Le problème est que je dois les supprimer en fonction de la valeur d'un autre champ. Comment pourrais-je faire cela? J'ai un sérialiseur comme:

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")

Comme vous pouvez le constater, je supprime déjà le champ "url" selon que la demande a été effectuée depuis une plate-forme mobile. Mais je voudrais supprimer le champ "éléments" en fonction de la valeur "type". Comment devrais-je faire ça?

Merci d'avance

14
FVod

Vous pouvez personnaliser le comportement de la sérialisation en remplaçant la méthode to_representation()dans votre sérialiseur.

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 
18
Rahul Gupta

Vous pouvez créer plusieurs sérialiseurs et choisir celui qui convient dans la vue.

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

utilisez l'héritage pour rendre les sérialiseurs DRY.

3
glmvrml

Mon problème était un peu similaire au vôtre et je l'ai résolu par héritage.

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',
        )
0
spedy