Ошибка ответа Django: объект 'Unicode' не имеет атрибута '_meta' json - PullRequest
0 голосов
/ 21 сентября 2018

Я использую django 1.11, и мне тяжело хранить ответ Json. Вот мой код views.py

views.py

    # -*- coding: utf-8 -*-
from __future__ import unicode_literals
from .models import addinfomodels
from django.shortcuts import render, redirect
from django.http import HttpResponse, JsonResponse
from django.core import serializers
import json
# Create your views here.
def addinfo(request):
    batch_year = [2016, 2017, 2018]
    dept = ['AERO', 'BME', 'CIVIL', 'CSE', 'ECE', 'EEE', 'E&I', 'MECH']
    type = ['onecredit', 'core', 'professional', 'openelective']
    return render(request, "cbcsportal/addinfo.html", {'type': type, 'batch': batch_year, 'dept': dept})

def rollvalue(request):
    return request.POST.get('rollno')
# d ={}
def jsonvalue(request):
    d = {"courses":[{"choices": [request.POST.get('choices00') ,request.POST.get('choices10')], "code": request.POST.get('code0'), "name": request.POST.get('name10')}]}

    ds = serializers.serialize('json', d)
    print ds
    return JsonResponse(ds, content_type="application/json", safe=False)


def posttodb(request):
    if request.method == "POST":
        data = addinfomodels()
        data.batch = request.POST.get('batch')
        data.dept = request.POST.get('dept')
        data.typeid = request.POST.get('typeid')
        data.type = request.POST.get('type')
        data.rollno = [rollvalue(request)]
        data.renderJSON = jsonvalue(request)
        data.starttime = request.POST.get('starttime0')
        data.endtime = request.POST.get('endtime0')
        data.save()
        return redirect('addinfo')

, пожалуйста, помогите мне, я получаю эту ошибку

У объекта 'Unicode' нет атрибута '_meta'

это обратная связь

Traceback :

Traceback:

Файл "C: \ Python27 \ lib \ site-packages \ django \ core \ handlers \ exception.py" во внутренней 41. ответ= get_response (запрос)

Файл "C: \ Python27 \ lib \ site-packages \ django \ core \ handlers \ base.py" в _get_response 187. response = self.process_exception_by_middleware (e, request)

Файл "C: \ Python27 \ lib \ site-packages \ django \ core \ handlers \ base.py" в _get_response 185. response = wrapped_callback (запрос, * callback_args, ** callback_kwargs)

Файл "C: \ Users \ admin \ Desktop \ SREC_OBA \ cbcsportal \ views.py" в posttodb 34. data.renderJSON = jsonvalue (запрос)

Файл "C: \ Users \ admin \ Desktop \ SREC_OBA \"cbcsportal \ views.py "в jsonvalue 21. ds = serializers.serialize ('json', d)

Файл" C: \ Python27 \ lib \ site-packages \ django \ core \ serializers__init __. py "вserialize 129. s.serialize (queryset, ** options)

Файл "C: \ Python27 \ lib \ site-packages \ django \ core \ serializers \ base.py" в сериализации 84. concrete_model = obj._meta.concrete_model

Тип исключения: AttributeError at / cbcs / posttodb Значение исключения: у объекта 'unicode' нет атрибута '_meta'

1 Ответ

0 голосов
/ 21 сентября 2018

Здесь:

d = {....}
ds = serializers.serialize('json', d)
#print ds
return JsonResponse(ds, content_type="application/json", safe=False)

Вы передаете диктовку serialize().Сериализатор Django предназначен для сериализации наборов запросов django orm (это задокументировано, и вы можете узнать об этом, прочитав трассировку).

Правильный способ сериализации команды python в json - это просто использовать json.dumps(yourdict).НО: в вашем случае это все равно бесполезно, так как JsonResponse ожидает питона dict в качестве первого аргумента t и позаботится о сериализации.Также вам не нужно устанавливать тип контента, это уже значение по умолчанию для JsonResponse.IOW, все, что вам нужно, это:

d = {....}
return JsonResponse(d, safe=False)

В качестве примечания: здесь:

def posttodb(request):
    if request.method == "POST":
        data = addinfomodels()
        data.batch = request.POST.get('batch')
        data.dept = request.POST.get('dept')
        data.typeid = request.POST.get('typeid')
        data.type = request.POST.get('type')
        data.rollno = [rollvalue(request)]
        data.renderJSON = jsonvalue(request)
        data.starttime = request.POST.get('starttime0')
        data.endtime = request.POST.get('endtime0')
        data.save()

Вы вставляете в свою базу данных данные, которые являются непроверенными, неанимированными пользовательскими вводами.НЕ ДЕЛАЙТЕ ЭТОГО !!!(если, конечно, вы не счастливы, что ваш сервер был взломан первым сценаристом, детка).Используйте формы Django (в данном случае ModelForm, чтобы позаботиться о проверке и дезинфекции.

...