Nik*_*ana 5 django serialization json response django-rest-framework
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
我得到的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":"[]"}
Run Code Online (Sandbox Code Playgroud)
还有其他方法吗?我了解的是,它对数据进行了两次编码(一次在serializers.serialize中,然后在response.Response中)。但是我不想要那个。我想要嵌套的对象。像这样:
{"attendances":[{"model": "mainApp.attendance", "pk": 5, "fields": {"ArrivalTime": "2016-06-27T18:45:46.355Z", "DepartureTime": null, "User": 4, "ArrivalImei": "1",...
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何实现这一目标?提前致谢。
正如您所确定的,您通过将查询集转换为 JSON 字符串,将它们添加到字典中,然后将字典传递给response.Response.
使用 Django REST Framework 的主要目的是为您处理序列化,因此目标应该是避免在 api 视图中自行序列化为 JSON 字符串。
ModelSerializer为了充分利用 DRF,您需要为要在响应中返回的每个模型定义。
DRF 中令人困惑的一件事是术语。通常,当我们谈论“序列化”时,它意味着将对象转换为字符串(即 JSON)。但在 DRF 中,序列化器实际上将复杂对象转换为原始对象。因此,当您使用 aModelSerializer来“序列化”您的查询集时,它不会生成 JSON 字符串,而是生成原始 Python 对象(字典),然后可以在传统意义上将其序列化为 JSON 字符串而不会出现错误。这种“真正的”序列化是由类为您完成的Response。
所以我建议作为一个起点:
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)
Run Code Online (Sandbox Code Playgroud)