Quiero serializar un modelo, pero quiero incluir un campo adicional que requiera realizar algunas búsquedas en la base de datos en la instancia del modelo para serializar:
class FooSerializer(serializers.ModelSerializer):
my_field = ... # result of some database queries on the input Foo object
class Meta:
model = Foo
fields = ('id', 'name', 'myfield')
¿Cuál es la forma correcta de hacer esto? Veo que puede pasar un "contexto" adicional al serializador, ¿es la respuesta correcta pasar en el campo adicional en un diccionario de contexto? Con ese enfoque, la lógica de obtener el campo que necesito no estaría contenida en la definición del serializador, lo cual es ideal ya que cada instancia serializada necesitará my_field
. En otra parte de la documentación de los serializadores DRF dice "los campos adicionales pueden corresponder a cualquier propiedad o invocarse en el modelo". ¿De qué campos extra estoy hablando? ¿Debo definir una función en Foo
la definición del modelo que devuelva my_field
valor, y en el serializador conecto my_field a ese invocable? ¿Cómo se ve eso?
Gracias de antemano, feliz de aclarar la pregunta si es necesario.
field_name = serializers.SerializerMethodField()
ydef get_field_name(self, obj):
foo
momento en que def un SerializerMethodField? cuando usa CreateAPIView, ¿el foo ha almacenado y luego puede usar el método is_named_bar ()?Puede cambiar su método de modelo a propiedad y usarlo en serializador con este enfoque.
Editar: con versiones recientes de rest framework (probé 3.3.3), no necesita cambiar a propiedad. El método modelo funcionará bien.
fuente
variable = model_instance.my_field
da el mismo resultado quevariable = model_instance.my_field()
sin el decorador. también: stackoverflow.com/a/6618176/2198571source='my_field'
No se requieren más y lanzar una excepciónCon la última versión de Django Rest Framework, debe crear un método en su modelo con el nombre del campo que desea agregar. No es necesario
@property
ysource='field'
genera un error.fuente
request
objeto dentro de def foo (self) que pueda modificar el valor de foo? (ejemplo, una búsqueda basada en request.user)Mi respuesta a una pregunta similar ( aquí ) podría ser útil.
Si tiene un Método modelo definido de la siguiente manera:
Puede agregar el resultado de llamar a dicho método a su serializador de la siguiente manera:
ps Dado que el campo personalizado no es realmente un campo en su modelo, generalmente querrá hacerlo de solo lectura, de esta manera:
fuente
si desea leer y escribir en su campo adicional, puede usar un nuevo serializador personalizado, que amplía los serializadores. Serializador, y úselo de esta manera
Lo uso en campos anidados relacionados con alguna lógica personalizada
fuente
Esto funcionó para mí . Si solo queremos agregar un campo adicional
ModelSerializer
, podemos hacerlo como a continuación, y también se le puede asignar un valor al campo después de algunos cálculos de búsqueda. O en algunos casos, si queremos enviar los parámetros en respuesta API.En model.py
En serializer.py
Espero que esto pueda ayudar a alguien.
fuente
Como dijo Chemical Programer en este comentario , en el último DRF puedes hacerlo así:
Fuente de documentos DRF
fuente