python - serializermethodfield - Todos los campos en ModelSerializer django rest framework
partial update django rest framework (2)
models.py :
class Car():
producer = models.ForeignKey(Producer, blank=True, null=True,)
color = models.CharField()
car_model = models.CharField()
doors = models.CharField()
serializers.py :
class CarSerializer(ModelSerializer):
class Meta:
model = Car
fields = Car._meta.get_all_field_names()
Entonces, aquí quiero usar todos los campos. Pero tengo un error:
El nombre de campo producer_id
no es válido para el modelo Car
.
¿Cómo arreglar eso?
¡Gracias!
Puede usar fields = ''__all__''
para obtener todos sus campos o puede especificar si desea que se devuelva un número limitado de campos. Ver documentación .
Pero esto devuelve el valor de id
para el campo de la clave externa, es decir, producer
en su caso. Para obtener todos los campos para el producer
, necesita crear una clase de serializador para eso también. Mira aquí .
Por lo tanto, su serializers.py actualizado debe ser:
class ProducerSerializer(ModelSerializer):
class Meta:
model = Producer
class CarSerializer(ModelSerializer):
producer= ProducerSerializer(read_only=True)
class Meta:
model = Car
fields = (''producer'', ''color'', ''car_model'', ''doors'', )
De acuerdo con la Documentación del Framework REST de Django sobre ModelSerializers :
De forma predeterminada, todos los campos del modelo en la clase se asignarán a los campos de serializador correspondientes.
Esto es diferente de ModelForms de Django , que requiere que especifique el atributo especial ''__all__''
para utilizar todos los campos del modelo. Por lo tanto, todo lo que es necesario es declarar el modelo.
class CarSerializer(ModelSerializer):
class Meta:
model = Car
Actualización (para versiones> = 3.5)
El comportamiento descrito anteriormente quedó obsoleto en la versión 3.3 y está prohibido desde la versión 3.5.
Ahora es obligatorio usar el atributo especial ''__all__''
para usar todos los campos en el Marco REST Django, al igual que los formularios Django:
Al no establecer ninguno de los campos o excluir, se generó una advertencia de obsolescencia pendiente en la versión 3.3 y se generó una advertencia de obsolescencia en 3.4. Su uso ahora es obligatorio.
Entonces ahora debe ser:
class CarSerializer(ModelSerializer):
class Meta:
model = Car
fields = ''__all__''