Json 带有反斜杠的序列化数据

Json serialized data having backslashes

我正在使用 rest_framework.response 方法发送多个 Django 模型的对象。但是,响应包含带引号的反斜杠。这是我的观点:

@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 中,然后在 response.Response 中)。但我不想要那个。我想要嵌套对象。像这样:

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

谁能告诉我如何实现这个?提前致谢。

终于解决了。问题是,当使用 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"
            }
        },

如您所见,您通过将查询集转换为 JSON 字符串,将它们添加到字典,然后将字典传递给 response.Response.

来对所有内容进行双序列化

使用 Django REST Framework 的大部分目的是为您处理序列化,因此目标应该是避免在 api 视图中自己序列化为 JSON 字符串。

要充分利用 DRF,您需要为每个要在响应中 return 的模型定义 ModelSerializer

DRF 中令人困惑的一件事是术语。通常当我们谈论 "serialization" 时,它意味着将对象转换为字符串(即 JSON)。但在 DRF 中,序列化器实际上将复杂对象转换为 -> 原始对象。因此,当您使用 ModelSerializer 到 "serialize" 查询集时,它不会生成 JSON 字符串,而是生成原始的 python 对象(字典),然后可以将其序列化,在常规意义上的 JSON 字符串没有错误。此 'real' 序列化由 Response class.

为您完成

所以我建议作为起点:

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)