start how framework example create django django-rest-framework

how - django rest framework vs django



Cómo cambiar el nombre del campo en Django REST Framework (3)

Esto funcionaría para las operaciones de escritura también

class ParkSerializer(serializers.ModelSerializer): location = serializers.CharField(source=''alternate_name'') class Meta: model = Park fields = (''id'', ''name'', ''location'')

Estoy tratando de cambiar el nombre del campo del modelo en Serializador DRF como alias en SQL. He probado diferentes métodos pero no puedo tener éxito.

models.py

class Park(models.Model): name = models.CharField(max_length=256) alternate_name = models.CharField(max_length=256, blank=True) objects = models.GeoManager() class Meta: db_table = u''p_park'' def __unicode__(self): return ''%s'' % self.name def alias_alternate_name(self): return self.alternate_name

serializers.py

class ParkSerializer(serializers.ModelSerializer): location = serializers.Field(source=''alias_alternate_name'') #location = serializers.SerializerMethodField(source=''alias_alternate_name'') #alternate_name as location class Meta: model = Park fields = (''id'', ''name'', ''location'')

También he intentado agregar un alias en Django Queryset, pero no puedo cambiarlo.

Actualizado

Esta es la excepción que estoy enfrentando

AttributeError at / ViewName / ''module'' object no tiene el atributo ''Field''

¿Cómo puedo hacer esto?

Gracias


Hay una muy buena característica en los campos de serializador y serializadores en general llamada ''fuente'' donde se puede especificar la fuente de datos del campo del modelo.

class ParkSerializer(serializers.ModelSerializer): location = serializers.SomeSerializerField(source=''alternate_name'') class Meta: model = Park fields = (''other_fields'', ''location'')

Donde serializadores. AlgunosSerializadorField pueden ser serializadores.CharField como sugiere su modelo, pero también puede hacerlo con cualquiera de los otros campos. También puede poner campos relacionales y otros serializadores en su lugar y esto todavía funcionaría como encanto. es decir, incluso si alternate_name era un campo de clave externa para otro modelo.

class ParkSerializer(serializers.ModelSerializer): locations = AlternateNameSerializer(source=''alternate_name'', many=true) class Meta: model = Park fields = (''other_fields'', ''locations'') class AlternateNameSerializer(serializers.ModelSerialzer): class Meta: model = SomeModel

Esto también funciona con la creación, eliminación y modificación del tipo de solicitudes. Efectivamente crea un mapeo uno a uno del nombre del campo en el serializador y el nombre del campo en los modelos.


Puede usar serializers.SerializerMethodField :

Aquí está el modelo Park, que tiene campos name y alternate_name.

class Park(models.Model): name = models.CharField(max_length=256) alternate_name = models.CharField(max_length=256, blank=True) objects = models.GeoManager() class Meta: db_table = u''p_park'' def __unicode__(self): return ''%s'' % self.name

Aquí está el serializador para Park Model, ParkSerializer. Esto cambia el nombre de alternate_name a location.

class ParkSerializer(serializers.ModelSerializer): location = serializers.SerializerMethodField(''get_alternate_name'') class Meta: model = Park fields = (''other_fields'', ''location'') def get_alternate_name(self, obj): return obj.alternate_name

Sin embargo, esto solo funcionaría para los campos de solo lectura.