2016-07-26 13 views
1

I rest_framework.response Methode verwenden Objekte mehrerer django Modelle zu senden. Die Antwort enthält jedoch Backslashes mit Anführungszeichen. Hier ist meine Ansicht:Json serialisierten Daten mit umgekehrten Schrägstrichen

@api_view() 
def myfunctions(request,id): 
    responseData = {} 
    userObject = TifUser.objects.filter(id=id) 
    attendances = Attendance.objects.filter(User=userObject) 
    leaves = Leave.objects.filter(User=userObject) 
    odds = ODD.objects.filter(User=userObject) 
    printjobs = PrintJob.objects.filter(User=userObject) 
    issues = Issue.objects.filter(User=userObject) 

    #serialize into json 
    userObject = serializers.serialize("json", userObject) 
    attendances = serializers.serialize("json",attendances) 
    leaves = serializers.serialize("json",leaves) 
    odds = serializers.serialize("json",odds) 
    printjobs = serializers.serialize("json",printjobs) 
    issues = serializers.serialize("json",issues) 

    #set responseData dictionary values 
    responseData['user'] = userObject 
    responseData['attendances'] = attendances 
    responseData['leaves'] = leaves 
    responseData['odds'] = odds 
    responseData['printjobs'] = printjobs 
    responseData['issues'] = issues 
    #responseData['attendances'] = userObject 
    return response.Response(responseData) 

Die json Antwort erhalte ich ist:

{"attendances":"[{\"model\": \"mainApp.attendance\", \"pk\": 5, \"fields\": {\"ArrivalTime\": \"2016-06-27T18:45:46.355Z\", \"DepartureTime\": null, \"User\": 4, \"ArrivalImei\": \"1\", \"DepartureImei\": null, \"Hash\": \"321f059c-4230-417a-adff-f0035097c85d\"}}, {\"model\": \"mainApp.attendance\", \"pk\": 13, \"fields\": {\"ArrivalTime\": \"2016-07-18T15:40:39.943Z\", \"DepartureTime\": null, \"User\": 4, \"ArrivalImei\": \"2\", \"DepartureImei\": null, \"Hash\": \"e61fad3e-8238-46fc-b09b-8b7754d43f3b\"}}]","printjobs":"[{\"model\": \"mainApp.printjob\", \"pk\": 1, \"fields\": {\"User\": 4, \"DateAdded\": \"2016-07-18\", \"Status\": \"disapproved\", \"Person\": 5, \"Level\": \"boss\", \"Client\": \"someone\", \"HandledBy\": \"tester\", \"SanctionedBy\": \"myself\", \"AdvancePayment\": 0, \"FinalPayment\": 1000, \"PaymentNumber\": 1, \"Remarks\": \"something\"}}]","odds":"[]","user":"[{\"model\": \"mainApp.tifuser\", \"pk\": 4, \"fields\": {\"AuthUser\": 7, \"Head\": null, \"Boss\": null, \"ClrLevel\": 1, \"Department\": 1, \"DesignationName\": 1, \"Name\": \"tester\", \"IsRegistered\": true, \"DateOfBirth\": \"1222-11-11\", \"Anniversary\": \"2001-12-22\", \"Mobile\": \"2134567890\", \"gcmDevice\": null, \"FatherName\": \"\", \"MotherName\": \"\", \"PersonalEmail\": \"\", \"Gender\": \"Male\", \"CurrentAddress\": \"\", \"PermanentAddress\": \"\", \"PANNumber\": \"\", \"AadharCardNumber\": null, \"BloodGroup\": \"\", \"MaritalStatus\": \"Married\", \"ProfilePhoto\": \"\", \"Imei\": \"\"}}]","leaves":"[]","issues":"[]"} 

Gibt es eine andere Möglichkeit, es zu tun? Was ich verstehe, ist, dass es die Daten zweimal codiert (einmal in serializers.serialize und dann in response.Response). Aber ich will das nicht. Ich möchte verschachtelte Objekte. Etwas wie dieses:

{"attendances":[{"model": "mainApp.attendance", "pk": 5, "fields": {"ArrivalTime": "2016-06-27T18:45:46.355Z", "DepartureTime": null, "User": 4, "ArrivalImei": "1",... 

Kann mir jemand sagen, wie man das erreicht? Danke im Voraus.

+0

Wenn Sie 'print' Ihre Json Antwort werden die Schrägstriche weg? –

+0

@ShangWang Ja, beim Drucken gibt es keine umgekehrten Schrägstriche. Nur in der Antwort bekomme ich sie. –

+0

Dann erhalten Sie JSON-Zeichenfolge, die die Anführungszeichen entkommt. Können Sie 'result = json.loads (json_response)' und sehen, ob 'result' eine Datenstruktur ist, die Sie wollen? –

Antwort

1

Wie Sie identifiziert, Sie sind doppelt Serialisierung alles von Ihrem querysets zu JSON-Strings konvertieren und fügte hinzu, sie zu einem dict und dann Passieren der dict response.Response.

Ein Großteil der Verwendung von Django REST Framework ist, dass die Serialisierung für Sie behandelt, so sollte das Ziel sein, Serialisierung zu JSON-Strings selbst in der API-Ansicht zu vermeiden.

Zur optimalen Nutzung von DRF machen Sie eine ModelSerializer für jedes der Modelle, die Sie in der Antwort zurückgeben möchten definieren müssen.

Eine Sache, die in DRF ist verwirrend ist die Terminologie. Wenn wir über "Serialisierung" sprechen, bedeutet das normalerweise, dass Objekte in eine Zeichenfolge (d. H. JSON) konvertiert werden. Aber in DRF konvertieren Serializer tatsächlich komplexe Objekte -> primitive Objekte. Wenn Sie also eine ModelSerializer verwenden, um „serialisiert“ Ihr queryset es erzeugt keine JSON-String, sondern primitive Python-Objekte (ein dict), die dann serialisiert werden kann, im herkömmlichen Sinn, in einen String JSON ohne Fehler. Diese 'echte' Serialisierung wird von der Klasse Response für Sie erledigt.

Deshalb schlage ich als Ausgangspunkt:

class TifUserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = TifUser 


class AttendanceSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Attendance 


class LeaveSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Leave 


class ODDSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ODD 


class PrintJobSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = PrintJob 

class IssueSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Issue 


@api_view() 
def myfunctions(request, id): 
    users = TifUser.objects.filter(id=id) 
    user_serializer = TifUserSerializer(users, many=True) 

    attendances = Attendance.objects.filter(User=userObject) 
    attendance_serializer = AttendanceSerializer(attendancesv, context={'request': request}) 

    leaves = Leave.objects.filter(User=userObject) 
    leave_serializer = LeaveSerializer(leaves, many=True) 

    odds = ODD.objects.filter(User=userObject) 
    odd_serializer = ODDSerializer(odds, many=True) 

    printjobs = PrintJob.objects.filter(User=userObject) 
    printjob_serializer = PrintJobSerializer(printjobs, many=True) 

    issues = Issue.objects.filter(User=userObject) 
    issue_serializer = IssueSerializer(issues, many=True) 

    responseData = {} 
    responseData['user'] = user_serializer.data 
    responseData['attendances'] = attendance_serializer.data 
    responseData['leaves'] = leave_serializer.data 
    responseData['odds'] = odd_serializer.data 
    responseData['printjobs'] = printjob_serializer.data 
    responseData['issues'] = issue_serializer.data 

    return response.Response(responseData) 
+0

das war, was ich am Anfang versucht habe zu tun. Aber ich habe den folgenden Fehler: ist nicht JSON serialisierbar. Deshalb musste ich es so machen. –

+0

@nikssardana Was mit DRF etwas verwirrend ist, ist normalerweise "Serialisierung" bedeutet Konvertieren von Objekt in String (zB JSON) aber DRF Serializer konvertieren tatsächlich komplexe Objekte -> primitive Objekte (dh die vom JSON Format unterstützten Primitive: dict, list, int, schweben, str). Diese primitiven Objekte können dann durch die Klasse "Response" in einen JSON-String serialisiert werden. Was Sie also brauchen, ist ein DRF-Serializer, der Ihre Django-Modellinstanzen in primitive Objekte übersetzt. Http://www.django-rest-framework.org/api-guide/serializers/ – Anentropic

+0

Was Sie wollen, ist 'ModelSerializer' http: // www .django-rest-framework.org/api-guide/serializer/# modellserializer – Anentropic

0

ich es endlich geschafft, es zu lösen. Das Problem war, als die Objekte mit der serializer.serialize() -Funktion serialisiert wurden, bekam ich eine Zeichenfolge. Während ich ein Diktat haben wollte. Ich hatte json.loads() verwenden Sie die Zeichenfolge in ein Wörterbuch zu konvertieren, wie:

responseData['user'] = json.loads(userObject) 

Und alles funktionierte, wie ich wollte. Nun ist die Antwort so etwas wie:

{ 
    "attendances": [ 
     { 
      "pk": 5, 
      "model": "mainApp.attendance", 
      "fields": { 
       "DepartureTime": null, 
       "Hash": "321f059c-4230-417a-adff-f0035097c85d", 
       "ArrivalImei": "1", 
       "DepartureImei": null, 
       "User": 4, 
       "ArrivalTime": "2016-06-27T18:45:46.355Z" 
      } 
     }, 
+0

es macht keinen Sinn, zu json serialisieren, dann unserialisieren und fügen Sie es zu Ihrem 'responseData' dict, dann haben Rest Framework serialisieren es wieder – Anentropic