Par*_*dav 4 python django json django-models
我正在尝试使用下面的代码将模型数据作为 json 发送
视图.py
def autocomplete(request):
model = NewCarModel.objects.only('car_model_new')
print('model is',model)
# users_list = list(model)
posts_serialized = serializers.serialize('json', model)
print('post is',posts_serialized)
return JsonResponse(posts_serialized,safe=False)
Run Code Online (Sandbox Code Playgroud)
模型.py
class NewCarModel(models.Model):
car_model_new = models.CharField(max_length=100, unique=True)
def __str__(self):
return self.car_model_new
Run Code Online (Sandbox Code Playgroud)
输出:
"[{\"model\": \"core.newcarmodel\", \"pk\": 1, \"fields\": {\"car_model_new\": \"swift\"}}, {\"model\": \"core.newcarmodel\", \"pk\": 2, \"fields\": {\"car_model_new\": \"wagonr\"}}, {\"model\": \"core.newcarmodel\", \"pk\": 3, \"fields\": {\"car_model_new\": \"baleno\"}}, {\"model\": \"core.newcarmodel\", \"pk\": 4, \"fields\": {\"car_model_new\": \"breeza\"}}, {\"model\": \"core.newcarmodel\", \"pk\": 5, \"fields\": {\"car_model_new\": \"spresso\"}}]"
Run Code Online (Sandbox Code Playgroud)
为什么我的 JSON 输出中有一堆反斜杠以及如何删除它们,Mozilla Firefox 默认 JSON 过滤器也不起作用,我也无法使用 java 脚本从中提取数据(因为我能够从一些公共数据中提取数据) API所以提取代码没有问题)
编辑:
我如何在将 JSON 解析为变量 myArr 后尝试提取数据
const carModelsArr = myArr.data.map((d) => d.fields.car_model_new
Run Code Online (Sandbox Code Playgroud)
编辑2:所以无法提取的解决方案是而不是
var myArr = JSON.parse(this.responseText);
Run Code Online (Sandbox Code Playgroud)
用过这个:
var myArr = JSON.parse(JSON.parse(this.responseText));
Run Code Online (Sandbox Code Playgroud)
并且提取代码能够工作
但仍然没有解决反斜杠问题,如果可能的话我想避免使用 DRF
我认为序列化程序这样做是为了"在将 dict 对象转换为 Json 对象时将双引号引起来。可能该 dict 对象已经具有用相同双引号括起来的键或值"。因此就有了这个反斜杠。
要摆脱它,json.loads如果使用Python,则必须使用,否则JSON.parse如果使用JS
Python3:
json.loads(response)
Run Code Online (Sandbox Code Playgroud)
JS:
JSON.parse(data)
Run Code Online (Sandbox Code Playgroud)
您将数据序列化两次,因此使用反斜杠,并且您被迫使用JSON.parse两次。由于您已经序列化了响应,因此您可以简单地使用HttpResponseorResponse返回该序列化数据。
解决方案1:
from django.http import HttpResponse
return HttpResponse(posts_serialized, content_type='application/json')
Run Code Online (Sandbox Code Playgroud)
解决方案2:
from rest_framework.response import Response
return Response(posts_serialized, content_type='application/json')
Run Code Online (Sandbox Code Playgroud)