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
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
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.
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',
)