2017-01-12 1 views
0

Ich bin neu in Djnago Ruherahmen 3 und nicht in der Lage zu verstehen, zu erzeugen, wie dies zu erreichen:
Ich habe folgendes Modell:Verwenden zusätzliche Anforderung param ein Modellfeld in DRF 3

class Interface(models.Model): 
    name = models.CharField(max_length=25) 
    current_location = models.CharField(max_length=25, blank=True) 

Und Anfrage Ich erwarte Breitengrad, Längengrad-Feld, das die geohash von Breite, Länge und speichern in current_location.

habe ich versucht, folgende Serializer und Viewset verwenden, aber es Fehler geben

'Interface' object has no attribute 'latitude'.

class InterfaceSerializer(serializers.ModelSerializer): 
    latitude = serializers.FloatField() 
    longitude = serializers.FloatField() 
    class Meta: 
     model = Interface 
     fields = ('id', 'name', 'latitude', 'longitude',) 
     read_only_fields = ('id',) 

class InterfaceViewSet(viewsets.ModelViewSet): 
"""                                    
API endpoint that allows interface to be viewed or edited.                      
""" 
    queryset = Interface.objects.all() 
    serializer_class = InterfaceSerializer 

Auch die serializers.Serializer anstelle von serializers.ModelSerializer gleichen Fehler gibt.
Was ist hier falsch?
Wie wird der Serializer für ein bestimmtes Modell und eine bestimmte Anforderung strukturiert?

Antwort

1

Wie denken Sie, Serialisierer wird über Zweck von latitute und longitute Felder wissen?
Sie sollten create Methode überschreiben, und setzen Sie current_location manuell

class InterfaceSerializer(serializers.ModelSerializer): 
    latitude = serializers.FloatField() 
    longitude = serializers.FloatField() 

    class Meta: 
     model = Interface 
     fields = ('id', 'name', 'latitude', 'longitude',) 

    def create(self, validated_data): 
     latitute = validated_data.get('latitude') 
     longitude = validated_data.get('longitude') 
     name = validated_data.get('name') 
     # suppose you want to store it charfield comma separated 
     current_location = str(latitute) + ',' + str(longtitute) 
     return Interface.objects.create(
         current_location=current_location, 
         name=name 
         ) 

Es gibt auch nützliche Paket django-geoposition es Feld und Widget für Geoposition bietet.

+0

Ich habe dies in Create-Methode versucht, aber es gibt denselben Fehler, d. H. 'Schnittstelle' Objekt hat kein Attribut 'Breite'. in der durchsuchbaren API. –

+0

@ r.bhardwaj hast du es wie ich geschrieben? vielleicht schreibst du so etwas in deinem Code 'Interface.objects.create (** valided_data)', damit du einen Fehler bekommst. Hast du meinen Code ausprobiert? Es sollte funktionieren –

+0

ja Ich habe Ihren Code versucht, aber es gibt denselben Fehler, wie ich den Code debugged. Der Fehler tritt vor der Methode create auf. Hier sind Details des Fehlers: AttributeError: Erhalte AttributeError, wenn er versucht, einen Wert für die Feldbreite auf dem Serializer InterfaceSerializer zu erhalten. Das Serializer-Feld wird möglicherweise falsch benannt und entspricht keinem Attribut oder Schlüssel der Interface-Instanz. Ursprünglicher Ausnahmetext war: Das Objekt 'Schnittstelle' hat kein Attribut 'Breite'. FYI habe diesen Serializer auf ein Viewset angewendet, das queryset = Interface.objects.all() –

Verwandte Themen