Django Rest Framework – Cómo agregar un campo personalizado en ModelSerializer

ModelSerializer un ModelSerializer y quiero agregar un campo personalizado que no sea parte de mi modelo.

Encontré una descripción para agregar campos adicionales aquí y probé lo siguiente:

 customField = CharField(source='my_field') 

Cuando agrego este campo y llamo a mi función validate() , este campo no es parte del attr . attr contiene todos los campos de modelo especificados excepto los campos adicionales. Entonces no puedo acceder a este campo en mi validación sobrescrita, ¿puedo?

Cuando agrego este campo a la lista de campos de esta manera:

 class Meta: model = Account fields = ('myfield1', 'myfield2', 'customField') 

luego recibo un error porque customField no es parte de mi modelo, lo que es correcto porque quiero agregarlo solo para este serializador.

¿Hay alguna manera de agregar un campo personalizado?

Estás haciendo lo correcto, excepto que CharField (y los otros campos escritos) son para campos de escritura.

En este caso, solo desea un campo de solo lectura simple, así que en su lugar solo use:

 customField = Field(source='get_absolute_url') 

De hecho existe una solución sin tocar en absoluto el modelo. Puede usar SerializerMethodField que le permite conectar cualquier método a su serializador.

 class FooSerializer(ModelSerializer): foo = serializers.SerializerMethodField() def get_foo(self, obj): return "Foo id: %i" % obj.pk 

… para mayor claridad, si tiene un Método Modelo definido de la siguiente manera:

 class MyModel(models.Model): ... def model_method(self): return "some_calculated_result" 

Puede agregar el resultado de llamar dicho método a su serializador de la siguiente manera:

 class MyModelSerializer(serializers.ModelSerializer): model_method_field = serializers.CharField(source='model_method') 

ps Dado que el campo personalizado no es realmente un campo en su modelo, normalmente querrá que sea de solo lectura, así:

 class Meta: model = MyModel read_only_fields = ( 'model_method_field', ) 

Aquí responda a su pregunta. debe agregar a su cuenta modelo:

 @property def my_field(self): return None 

ahora puedes usar:

 customField = CharField(source='my_field') 

fuente: https://stackoverflow.com/a/18396622/3220916

Con la última versión de Django Rest Framework, debe crear un método en su modelo con el nombre del campo que desea agregar.

 class Foo(models.Model): . . . def foo(self): return 'stuff' . . . class FooSerializer(ModelSerializer): foo = serializers.ReadOnlyField() class Meta: model = Foo fields = ('foo',) 

Para mostrar self.author.full_name , recibí un error con Field . Funcionó con ReadOnlyField :

 class CommentSerializer(serializers.HyperlinkedModelSerializer): author_name = ReadOnlyField(source="author.full_name") class Meta: model = Comment fields = ('url', 'content', 'author_name', 'author')