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