Hace unas semanas empece a desarrollar  en Django Rest Framework, (DRF), y me ha parecido genial esta app de Django, se hace muy fácil y sencillo el construir una RestFull API en poco tiempo. En cierto momento, a medida que me documentaba y estaba desarrollando me encontré con un pequeño problema.

En mi modelo de cliente tenia un campo de opciones tipo Choices de Django, el cual quería que cuando se consultaran al modelo cliente se mostrara sus valores mas no las claves (cuando se creara si sus claves).

El campo que quería serializar era estado civil :

 


options_civil_state = (
('s', 'Single'),
('m', 'Married'),
('d', 'Divorce'),
('w', 'Widower'),
)
civil_state = models.CharField(max_length=1, choices=options_civil_state)

 

DRF ofrece el campo ChoiceField, donde tan solo debe pasarsele como argumento una lista de valores aceptable, o una tupla de clave/valor. este  casi se ajustaba a mis requerimientos excepto porque a la hora de consultar representaba las claves y no los valores.

Decidí hacer algo que me encanta de Python y Django la posibilidad de sobre escribir comportamientos predeterminados de clases padres. Cree una clase que hereda de ChoiceField, redefini el método de representación, y llame a esa nueva clase como el campo que quería representar, lo hice de la siguiente manera:

 


class CustomChoiceField(serializers.ChoiceField):
      def __init__(self, choices, **kwargs):
          self.choices_to_dict = choices
          serializers.ChoiceField.__init__(self, choices,**kwargs)
     def to_representation(self, value):
         dictionary = dict(self.choices_to_dict)
         return dictionary.get(value)

 

Mi serializer de Cliente


class ClientSerializer(serializers.ModelSerializer):
      civil_state = CustomChoiceField(choices=Client.options_civil_state)
      class Meta:
         model = Client
         fields = ('id', 'username','civil_state', 'first_name', 'last_name')

Mi modelo de Cliente


class Client(User):
 options_civil_state = (
 ('s', 'Single'),
 ('m', 'Married'),
 ('d', 'Divorce'),
 ('w', 'Widower'),
 )
 civil_state = models.CharField(max_length=1, choices=options_civil_state)

Ahora cuando en mi base de datos pueda tener guardado la clave cuando se consulte lo que mostrara la api es el valor.

ComparteShare on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0Print this page