update serializermethodfield queryset password modelserializer method framework python django django-rest-framework

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