2017-09-13 4 views
0

Je l'SerializerField suivante:passe Aucun au to_representation DRF SerializerField

class TimestampField(Field): 
    def to_representation(self, value): 
     if not value: 
      return '' 

     return value.timestamp() 

Et je l'utilise comme ça dans mon sérialiseur:

class ArticlePhotobookSerializer(ModelSerializer): 
    delivery_date_from = TimestampField() 
    delivery_date_to = TimestampField() 

Maintenant, le getter delivery_date_to peut retourner Aucun, que je veux pour transformer en une chaîne vide en utilisant la méthode to_representation. cependant, lorsque j'utilise le Serializer pour analyser cette valeur None, il ne saisit même pas la méthode to_representation et renvoie immédiatement None. Que dois-je changer pour utiliser également la méthode to_representation pour None?

Répondre

1

Par défaut, la méthode to_representation du sérialiseur ignore les champs sans valeur (voir source).

Vous pouvez écrire classe mixin pour remplacer par défaut to_representation:

class ToReprMixin(object): 
    def to_representation(self, instance): 
     ret = OrderedDict() 
     fields = [field for field in self.fields.values() if not field.write_only] 

     for field in fields: 
      try: 
       attribute = field.get_attribute(instance) 
      except SkipField: 
       continue 

      ret[field.field_name] = field.to_representation(attribute) 

     return ret 

et l'utiliser dans vos serializers:

class ArticlePhotobookSerializer(ToReprMixin, ModelSerializer): 
    ... 
+1

C'est une "fonctionnalité" agréable ... ;-) Merci pour avoir signalé à moi! J'espérais qu'un seul réglage suffirait, c'est un changement assez important pour une si petite chose. – physicalattraction