webentwicklung-frage-antwort-db.com.de

So ändern Sie den Feldnamen in Django REST Framework

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?

71
Shoaib Ijaz

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.

34
erthalion

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.

185
iankit

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