Ich versuche, den Modellfeldnamen in DRF Serializer wie einen Alias in SQL zu ändern. Ich habe verschiedene Methoden ausprobiert, kann aber keinen Erfolg haben.
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 ihn aber nicht ändern.
Aktualisiert
Dies ist die Ausnahme, mit der ich konfrontiert bin
AttributeError am Objekt / ViewName / 'module' hat kein Attribut 'Field'
Wie kann ich das machen?
django
django-rest-framework
Shoaib Ijaz
quelle
quelle
serializers.SerializerMethodField
Ansatzes? Ich meine das:serializers.SerializerMethodField('get_location')
unddef get_location(self, obj): ...
serializers.py
?Antworten:
Sie können verwenden
serializers.SerializerMethodField
:Hier ist das Modell Park mit den Feldern Name und Alternate_Name.
Hier ist Serializer für Park Model, ParkSerializer. Dadurch wird der Name von alternative_name in location geändert.
Zusätzlich können Sie
serializers.CharField
mitsource
Attribut verwenden:Djangos
__
Notation zum Durchlaufen von Fremdschlüsseln funktioniert auch:location = serializers.CharField(source='OtherModel__other_fields')
Das gleiche Prinzip gilt, wenn Sie den Rückgabetyp in der API ändern möchten, damit Sie dies auch für
serializers.DecimalField(source=...)
andere Feldtypen tun können .Dies würde jedoch nur für schreibgeschützte Felder funktionieren.
quelle
source
Sie stattdessen das kwarg wie unten beschrieben.In Serializer-Feldern und Serializern im Allgemeinen gibt es eine sehr nette Funktion namens "Quelle", mit der Sie die Datenquelle aus dem Modellfeld angeben können.
Wobei serializers.SomeSerializerField serializers.CharField sein kann, wie Ihr Modell vorschlägt, aber auch durch eines der anderen Felder. Sie können stattdessen auch relationale Felder und andere Serialisierer einfügen, und dies würde immer noch wie ein Zauber funktionieren. dh selbst wenn alternative_name ein Fremdschlüsselfeld für ein anderes Modell war.
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.
quelle
source
ist ein allgemeinerer Ansatz. Sie können jedoch nur wenige Versuche sehen, es in der Frage zu verwenden. Wenn Sie also auf diese Weise antworten möchten, sollten Sie auch klarstellen, warum der ursprüngliche Code nicht funktioniert, nicht wahr?locations = serializers.PrimaryKeyRelatedField(source='alternate_name', queryset=AlternateName.objects.all())
. AnscheinendRelatedField
kann auch verwendet werden.Dies würde auch für Schreibvorgänge funktionieren
quelle