2017-11-13 3 views
1

Ich habe ein Modell "Zuordnung", die ich über die API aktualisieren möchten.Update Model Instanz über Django REST POST

pro Kommentare

Aktualisiert

urls.py

router = routers.DefaultRouter() 
router.register(r'assignments', views.AssignmentList, base_name='Assignments') 

urlpatterns = [ 
    url(r'^api/v1/', include(router.urls)), 
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 
] 

serializers.py

class AssignmentSerializer(serializers.ModelSerializer): 
class Meta: 
    model = Assignment 
    fields = (
     'id', 'company', 'farm', 'sensor', 'name', 'location', 'notes', 'units', 'max_height', 'frequency', 
     'interval', 'max_threshold', 'min_threshold', 'notify', 'last_alert_time', 'last_alert_water_level') 

views.py

class AssignmentList(viewsets.ModelViewSet): 
serializer_class = AssignmentSerializer 
pagination_class = None 

def get_queryset(self): 
    queryset = Assignment.objects.all() 
    company_id = self.request.query_params.get('company_id', None) 
    sensor_id = self.request.query_params.get('sensor_id', None) 
    if company_id is not None: 
     queryset = Assignment.objects.filter(company_id=company_id) 
    if sensor_id is not None: 
     queryset = Assignment.objects.filter(sensor_id=sensor_id) 
    return queryset 

Momentan ermöglicht meine Ansicht eine einfache Filterung basierend auf zwei der Felder 'company_id' und 'sensor_id'. Dies ermöglicht einen einfachen Zugriff auf die Daten in JSON. Leider kann ich nicht herausfinden, wie man selbst mit dem eingebauten API-Formular zurückschickt. Ich würde gerne in der Lage sein, zu einer einzigen Instanz zu filtern und ein einzelnes Feld zu bearbeiten, sagen wir "assignment.name" für jetzt.

Es ist mein Verständnis, dass ...

Die von der ModelViewSet-Klasse .list sind(), .retrieve(), .Create(), .update(), .partial_update(), und .destroy(). (DRF Docs)

Also was muss ich tun, um sie zu nutzen, um eine Modellinstanz über URL zu bearbeiten? Oder redigiere einfach eine Periode. Ich bin im Kreis gelaufen und habe verschiedene Mixins, Views (UpdateAPIView, RetrieveUpdateAPIView etc.) und diese Frage insbesondere Stack Overflow: Django Rest Framework update field getestet.

+0

Sie müssen nichts tun. Das ViewSet tut bereits alles, um dies zu unterstützen. –

+0

Na dann, wie benutze ich es? Das integrierte Formular wird nicht validiert, da die Fremdschlüssel 'company_id', 'farm_id' und 'sensor_id' nicht vorhanden sind. Warum das fehlt, ist eine andere Frage. – Jon

Antwort

1

Warum fehlt Ihnen die erforderlichen Fremdschlüsselfelder ganz die Frage.

Der Grund dafür ist, dass vermutlich Ihre Felder company genannt werden, farm und sensor, nicht company_id usw. Da die zugrunde liegenden Datenbankfelder company_id und so weiter genannt werden, DRF erkennt sie als schreibgeschützte Eigenschaften auf dem Modell und so Mit dieser Option können Sie die Namen in den Feldern tuple angeben, ohne dass ein Fehler angezeigt wird. Das Feld wird jedoch nicht in der durchsuchbaren API angezeigt. Ändern Sie das fields Tupel so, dass es die tatsächlichen Namen der Django-Felder enthält.

Beachten Sie auch, dass DRF, da Sie HyperlinkedModelSerializer verwenden, einen verknüpften ViewSet für diese verwandten Modelle erwartet. Wenn Sie diese nicht definiert haben, können Sie sie einem einfachen ModelSerializer zuweisen.

+0

Danke für die folgende Führung. Die API serialisierte zuvor alle Felder, aber diese fehlten im Formular. Jetzt rendern diese Felder mit Selects voll von "Firma/Farm/Sensor-Objekt". Es ist also nicht wirklich brauchbar (nichts, um zwischen Objekten zu unterscheiden), aber wenn man sie auswählt, kann das Formular posten. Wie würde ich eine Instanz zum Bearbeiten auswählen? – Jon

+0

Definieren Sie eine '__str__'-Methode für diese Modelle (oder' __unicode__', wenn Sie noch Python 2 verwenden.7) - Dies ist das gleiche Prinzip wie für die Admin-Site. –

+0

Könnten Sie ein wenig darauf eingehen? Vielleicht fügen Sie ein Beispiel zu Ihrer Antwort oben hinzu? Ich bin mir nicht sicher, was Sie mit "Define a' __str__' Methode für * diese * Modelle "meinen. Ich versuche nur ein Feld einer Instanz eines Modells zu bearbeiten. – Jon

Verwandte Themen