2017-06-17 4 views
2

Ich habe zwei SerializerMethodFields auf einem Serializer. Einer von ihnen gibt obj.somelist.count() in Ordnung zurück. Aber wo ich die andere Methode frage, obj.somelist [0] zurückzugeben, bekomme ich ein TypeError 'RelatedManager'-Objekt unterstützt keine Indizierung. Jeder Rat wird sehr geschätzt. Hier einige Code:Django Rest Framework SerializerMethodField TypeError: "'RelatedManager'-Objekt unterstützt keine Indizierung"

class TripPlaceSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = TripPlace 
     fields = ('trip', 'place',) 


class StopSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = TripPlace 
     fields = ('place',) 
     depth = 1 


class TripSerializer(serializers.ModelSerializer): 
    stops = StopSerializer(read_only=True, many=True) 
    stops_count = serializers.SerializerMethodField() 
    car = CarSerializer(read_only=True, many=False) 
    origin = serializers.SerializerMethodField() 
    # final = serializers.SerializerMethodField() 

    class Meta: 
     model = Trip 
     fields = ('id', 'name', 'owner', 'car', 'stops_count', 'stops', 'origin',) 

    def get_stops_count(self, obj): 
     return obj.stops.count() 

    def get_origin(self, obj): 
     return obj.stops.first() 

Antwort

1

obj.somelist die RelatedManager für was auch immer ist die zugrunde liegende Beziehung ist, können Sie es nicht direkt Index. Sie sollten die first Methode des RelatedManager nennen das erste Objekt zu erhalten:

def get_origin(self, obj): 
    return obj.somelist.first() 

Oder Sie können Index (oder Scheibe) ein queryset des Managers einen anderen Index unterscheidet sich von 0 mit:

def get_origin(self, obj): 
    return obj.somelist.all()[ind] 
+0

' '' first() '' 'gibt die Instanz des ersten Stopps zurück, aber jetzt gibt das Modell, das die Join-Tabelle zwischen einem Trip und einer Stelle darstellt, die der StopSerializer gerade mit einer Tiefe von 1 ist, das Objekt vom Typ" TripPlace "zurück nicht serialisierbar. Aktualisierter Code ^. Es wurde vorher gut gerendert. – alirk

+0

@alirk Entschuldigung, wenn die Antwort dein ursprüngliches Problem behebt, kannst du vielleicht nach einem neuen fragen. –

+0

Danke für Ihre Hilfe :) – alirk

Verwandte Themen