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.