通用视图中的Django JsonRequest始终返回字符串

时间:2018-04-14 23:24:38

标签: python json ajax django django-views

(使用Django2.0) 这是我第一次尝试与前端开发人员合作,我正在尝试从通用ListView序列化Django模型。即使我设法发送一个JsonResponse作为json我的对象,它们总是一个字符串:

"[{\"model\": \"questions.question\", \"pk\": 9535, \"fields\": {\"created\": \"2018-04-14T17:02:38.559Z\", \"modified\": \"2018-04-14T18:04:14.264Z\", \"question\": \"TEST\", \"category\": \"Rules\", \"event\": \"Beyonce\", \"answer\": \"aergaergaergaer\", \"verified\": true, \"verified_by\": [\"someotheruser\"], \"count\": 0, \"user_created\": [\"someuser\"]}}]"

前端开发人员解决此问题的方式是调用JSON.parse()。 (见:https://www.w3schools.com/js/js_json_parse.asp)。

这是正确的方法,还是应该在没有字符串的情况下返回对象?

如果我错了,并且有一种方法可以在没有字符串的情况下执行此操作,那么我的观点和网址是:

views.py:

from events.models import Event
from django.core import serializers
from django.http import JsonResponse

class EventView(LoginRequiredMixin, ListView):
    login_url = '/accounts/login/'
    model = Question
    template_name = 'faq/faq.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        events_list = Event.objects.all()
        context['events_list'] = events_list
        return context

    def get_queryset(self):
        event = Event.objects.get(event=self.kwargs['event'])
        queryset = Question.objects.filter(event=event)
        return queryset

    def get(self, request, *args, **kwargs):
        queryset = self.get_queryset()
        data = serializers.serialize("json", queryset, use_natural_foreign_keys=True)
        return JsonResponse(data, status=200, safe=False)

urls.py

urlpatterns += [
    path('<str:event>/', EventView.as_view(), name='event'),
]

我也尝试过:

def EventRequest(request, **kwargs):
    event = Event.objects.get(event=kwargs['event'])
    queryset = Question.objects.filter(event=event)
    data = serializers.serialize("json", queryset, use_natural_foreign_keys=True)
    dump = json.dumps(data)
    return HttpResponse(dump, content_type='application/json')

def EventRequest(request, **kwargs):
    event = Event.objects.get(event=kwargs['event'])
    queryset = Question.objects.filter(event=event)
    data = serializers.serialize("json", queryset, use_natural_foreign_keys=True)
    return JsonResponse(data, status=200, safe=False)

再一次,这可能绝对正确,前端开发人员应该只做一个JSON.parse()。请让我知道,谢谢!

1 个答案:

答案 0 :(得分:1)

这很正常。 JSON是一个字符串表示法。它只是一种将JavaScript对象和数组(Python dicts和列表)表示为字符串的格式。

在前端,您必须使用JSON.parse()将其转换为JavaScript数组(列表)或对象(dict)。

当您从前端向后端发送JSON时,这也适用。您使用JSON.stringify()将JS对象转换为字符串。然后在后端使用json.loads()将该字符串转换为Python对象。