Come cambiare il nome del campo in Django REST Framework

Sto cercando di cambiare il nome del campo Modello in Serializzatore DRF come alias in SQL. Ho provato diversi metodi ma non riesco.

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

Ho anche provato ad aggiungere un alias in Django Queryset ma non posso cambiarlo.

aggiornato

Questa è l’eccezione che sto affrontando

AttributeError at / ViewName / ‘module’ object non ha attributo ‘Field’

Come posso fare questo?

Grazie

Puoi utilizzare serializers.SerializerMethodField :

Ecco il modello Park, che ha campi name e 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 

Ecco Serializer per Park Model, ParkSerializer. Questo cambia il nome di alternate_name in posizione.

 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 

Ciò tuttavia funzionerebbe solo per i campi di sola lettura.

C’è una funzione molto carina nei campi serializzatori e serializzatori in generale chiamati ‘origine’ dove è ansible specificare l’origine dei dati dal campo del modello.

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

Dove serializers.SomeSerializerField può essere serializers.CharField come suggerisce il modello, ma può anche utilizzare uno qualsiasi degli altri campi. Inoltre puoi inserire campi relazionali e altri serializzatori e questo funzionerebbe comunque come un incantesimo. vale a dire anche se alternate_name era un campo foreignkey per un altro modello.

 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 

Questo funziona anche con la creazione, l’eliminazione e la modifica del tipo di richieste. Crea efficacemente uno su uno il mapping del nome del campo nel serializzatore e il nome del campo nei modelli.

Ciò funzionerebbe anche per le operazioni di scrittura

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