2015-01-28 28 views
10

models.py:Fremdschlüsselwert in Django REST-Framework

class Station(models.Model): 
    station = models.CharField() 

class Flat(models.Model): 
    station = models.ForeignKey(Station, related_name="metro") 
    # another fields 

Dann in serializers.py:

class StationSerializer(serializers.ModelSerializer): 
    station = serializers.RelatedField(read_only=True) 

    class Meta: 
     model = Station 


class FlatSerializer(serializers.ModelSerializer): 
    station_name = serializers.RelatedField(source='station', read_only=True) 

    class Meta: 
     model = Flat 
     fields = ('station_name',) 

Und ich habe einen Fehler:

NotImplementedError: RelatedField.to_representation() must be implemented. If you are upgrading from REST framework version 2 you might want ReadOnlyField .
I read this , but it does not help me.
How to fix that?
Thanks!

+2

Warum verwenden Sie RelatedField für das Station.station-Feld? Sicher sollte es CharField sein. –

+0

@DanielRoseman mit '' 'station = serializers.CharField (read_only = True)' '' das gleiche Problem – tim

Antwort

13

RelatedField ist die Basisklasse für alle fi Felder, die an Beziehungen arbeiten. Normalerweise sollten Sie es nicht verwenden, es sei denn, Sie erstellen eine Unterklasse für ein benutzerdefiniertes Feld.

In Ihrem Fall brauchen Sie überhaupt kein verwandtes Feld. Sie suchen nur nach einer schreibgeschützten einzelnen Fremdschlüsselrepräsentation, so dass Sie einfach eine CharField verwenden können.

class StationSerializer(serializers.ModelSerializer): 
    station = serializers.CharField(read_only=True) 

    class Meta: 
     model = Station 


class FlatSerializer(serializers.ModelSerializer): 
    station_name = serializers.CharField(source='station.name', read_only=True) 

    class Meta: 
     model = Flat 
     fields = ('station_name',) 

Sie erscheinen auch in Ihrem FlatSerializer die name des Station Objekt zu wollen. Sie sollten den source Punkt auf das genaue Feld haben, also habe ich ihn für Sie auf station.name aktualisiert.

+0

Vielen Dank! Dies scheint die neueste Implementierung zu sein. –

Verwandte Themen