2015-01-28 15 views
10

models.py:wartość Klucz obcy w Django REST ramowa

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

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

Następnie w 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',) 

I mam błąd:

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

Dlaczego używasz parametru RelatedField dla pola Station.station? Z pewnością powinien to być CharField. –

+0

@DanielRoseman z '' 'station = serializers.CharField (read_only = True)' '' ten sam problem – tim

Odpowiedz

13

RelatedField to podstawowa klasa dla wszystkich fi pola, które działają na relacje. Zwykle nie powinieneś go używać, chyba że podklasujesz go dla niestandardowego pola.

W twoim przypadku nawet nie potrzebujesz pokrewnego pola. Szukasz tylko jednej reprezentacji klucza obcego w trybie tylko do odczytu, więc możesz po prostu użyć CharField.

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

również pojawić się Państwo chcą name obiektu Station w FlatSerializer. Powinieneś mieć punkt source z dokładnym polem, więc zaktualizowałem go do station.name dla ciebie.

+0

Dziękujemy! Wydaje się, że jest to najnowsza implementacja. –