2016-07-26 2 views
1

rest_framework.response 메서드를 사용하여 여러 장고 모델의 개체를 보내고 있습니다. 그러나 응답에는 따옴표가있는 백 슬래시가 포함됩니다.Json은 백 슬래시가있는 데이터를 직렬화했습니다.

@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) 

내가 무엇입니까 JSON 응답은 다음과 같습니다 : 그것을 할 수있는 다른 방법은

{"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":"[]"} 

거기에 여기 내 견해는 무엇입니까? 내가 이해하는 것은 데이터를 두 번 인코딩하는 것입니다 (한 번 serializers.serialize에서 응답 한 다음 응답). 그러나 나는 그것을 원하지 않는다. 중첩 된 객체가 필요합니다. 다음과 같은 내용 :

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

아무에게도이를 알릴 수 있습니까? 미리 감사드립니다.

+0

을 사라하는 경우? –

+0

@ShangWang 예, 인쇄하는 동안 백 슬래시가 없습니다. 그것은 내가 그들을 얻고 있다는 반응 일뿐입니다. –

+0

그러면 인용 부호를 이스케이프하는 json 문자열을 얻게됩니다. 당신은'result = json.loads (json_response)'를 할 수 있고'result'가 당신이 원하는 데이터 구조인지 알 수 있습니까? –

답변

1

, 당신은 이중 직렬화, JSON 문자열로 검색어 세트를 변환 딕셔너리에 추가 한 후 response.Response에 DICT를 전달하여 모든 위치 : 이제 응답은 같은입니다.

Django REST Framework를 사용하는 데있어 많은 부분이 직렬화를 처리하기 때문에 API보기에서 직접 JSON 문자열을 직렬화하는 것을 피하는 것이 좋습니다.

DRF를 최대한 활용하려면 응답에서 반환 할 각 모델에 대해 ModelSerializer을 정의해야합니다.

DRF에서 혼란스러운 것은 용어입니다. 일반적으로 "직렬화"에 관해 이야기 할 때 객체를 문자열 (JSON)로 변환하는 것을 의미합니다. 그러나 DRF에서 serializer는 실제로 복잡한 객체 -> 원시 객체를 변환합니다. 따라서 ModelSerializer을 사용하여 쿼리 세트를 "직렬화"하면 JSON 문자열이 생성되지 않고 원래의 의미로 오류없이 JSON 문자열로 직렬화 될 수있는 원시 Python 객체 (사전)가 생성됩니다. 이 '실제'직렬화는 Response 클래스에 의해 수행됩니다.

그래서 나는 출발점으로 제안 : 당신은`당신의 JSON 응답을 print`, 백 슬래시가

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

이것은 처음에 시도한 것입니다. 하지만 다음과 같은 오류가 발생했습니다 : <출석 : 2016-06-27 18 : 45 : 46.355095 + 00 : 00 ~ 없음> JSON을 직렬화 할 수 없습니다. 그래서 내가 이런 방식으로해야만했습니다. –

+0

@nikssardana DRF와 약간 혼동되는 것은 일반적으로 객체를 문자열 (예 : JSON)로 변환하는 것을 의미하지만 DRF 직렬 변환기는 실제로는 복잡한 객체 -> 기본 객체 (예 : JSON 형식으로 지원되는 프리미티브 : dict, list, int, float, str). 이 원시 객체는'Response' 클래스에 의해 JSON 문자열로 직렬화 될 수 있습니다. 그래서 당신이 필요로하는 것은 Django 모델 인스턴스를 원시 객체로 변환하는 DRF 시리얼 라이저입니다. http://www.django-rest-framework.org/api-guide/serializers/ – Anentropic

+0

원하는 것은'ModelSerializer'입니다 http : // www .django-rest-framework.org/api-guide/serializers/# modelserializer – Anentropic

0

나는 결국 그것을 해결할 수있었습니다. 문제는 객체가 serializer.serialize() 함수를 사용하여 직렬화 될 때 문자열을 얻는 것이 었습니다. 반면 나는 딕트가 필요했다. 문자열을 사전으로 변환하려면 json.loads()를 사용해야했습니다.

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

모든 것이 내가 원하는대로 작동했습니다.

이 확인 된
{ 
    "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

json으로 직렬화하는 것은 의미가 없으므로이를 직렬화 해제하고'responseData' dict에 추가 한 다음 rest framework을 사용하여 다시 직렬화하십시오. – Anentropic

관련 문제