Ich versuche, den Modellfeldnamen in DRF Serializer wie einen Alias in SQL zu ändern. Ich habe verschiedene Methoden ausprobiert, kann aber nicht erfolgreich sein.
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')
Ich habe auch versucht, einen Alias in Django Queryset hinzuzufügen, kann diesen aber nicht ändern.
aktualisiert
Dies ist die Ausnahme, vor der ich stehe
AttributeError at/ViewName/'module' Objekt hat kein Attribut 'Field'
Wie kann ich das machen?
Sie können serializers.SerializerMethodField
Verwenden:
Hier ist das Modell Park mit den Feldern name und 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
Hier ist der Serializer für Park Model, ParkSerializer. Dadurch wird der Name von alternativer_name in Speicherort geändert.
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
Zusätzlich können Sie serializers.CharField
Mit dem source
Attribut verwenden:
class ParkSerializer(serializers.ModelSerializer):
location = serializers.CharField(source='other_fields')
class Meta:
model = Park
fields = ('other_fields', 'location')
Djangos __
- Notation zum Durchlaufen von Fremdschlüsseln funktioniert auch:
location = serializers.CharField(source='OtherModel__other_fields')
Dasselbe Prinzip gilt, wenn Sie den Rückgabetyp in der API ändern möchten, sodass Sie auch serializers.DecimalField(source=...)
und andere Feldtypen ausführen können.
Dies würde jedoch nur für schreibgeschützte Felder funktionieren.
Es gibt eine sehr nette Funktion in Serializer-Feldern und Serializern im Allgemeinen, die als "Quelle" bezeichnet wird und in der Sie die Datenquelle aus dem Modellfeld angeben können.
class ParkSerializer(serializers.ModelSerializer):
location = serializers.SomeSerializerField(source='alternate_name')
class Meta:
model = Park
fields = ('other_fields', 'location')
Wobei serializers.SomeSerializerField serializers.CharField sein kann, wie Ihr Modell vorschlägt, aber auch eines der anderen Felder. Sie können stattdessen auch relationale Felder und andere Serialisierer einfügen, und dies würde immer noch charmant funktionieren. dh auch wenn alternativer_name ein Fremdschlüsselfeld für ein anderes Modell war.
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
Dies funktioniert auch beim Erstellen, Löschen und Ändern von Anforderungen. Es erstellt effektiv eine Eins-zu-Eins-Zuordnung von Feldnamen im Serializer und Feldnamen in Modellen.
Dies würde auch für Schreiboperationen funktionieren
class ParkSerializer(serializers.ModelSerializer):
location = serializers.CharField(source='alternate_name')
class Meta:
model = Park
fields = ('id', 'name', 'location')