tutorial queryset primarykeyrelatedfield instalar framework foreign español como python django django-rest-framework

python - queryset - django rest framework tutorial



Django Rest Framework-Cómo agregar un campo personalizado en ModelSerializer (6)

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

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

Puede agregar el resultado de llamar a 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, generalmente querrá que sea de solo lectura, así:

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

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

Encontré una descripción para agregar campos adicionales here 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 del modelo especificados, excepto los campos adicionales. Entonces no puedo acceder a este campo en mi validación sobreescrita, ¿o sí?

Cuando agregue este campo a la lista de campos como esta:

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 forma de agregar un campo personalizado?


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


De hecho hay 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


Está haciendo lo correcto, excepto que CharField (y los otros campos escritos) son para campos que se pueden escribir.

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

customField = Field(source=''get_absolute_url'')


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


aquí responde tu pregunta deberías agregar a tu modelo Cuenta:

@property def my_field(self): return None

ahora puedes usar:

customField = CharField(source=''my_field'')

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