Ошибка ответа django объект 'unicode' не имеет атрибута '_meta' json

Я использую 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

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

Отслеживание:

Выслеживать:

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

Файл "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" в сериализации 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


person ANISH TIWARI    schedule 21.09.2018    source источник
comment
добавить полную трассировку стека   -  person yogesh10    schedule 21.09.2018
comment
добавлена ​​трассировка стека @YogeshMhaskule   -  person ANISH TIWARI    schedule 21.09.2018


Ответы (1)


Здесь:

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

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

Правильный способ сериализации python dict в 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, чтобы позаботиться о проверке и очистке.

person bruno desthuilliers    schedule 21.09.2018
comment
Спасибо @bruno, но я уже пробовал это, но мне не удалось сохранить его в db. При этом я получаю ‹JsonResponse status_code = 200, application / json› не является сериализуемой ошибкой JSON - person ANISH TIWARI; 21.09.2018
comment
@ANISHTIWARI трассировка без соответствующего кода совершенно бесполезна, но, кстати, обход проверки и дезинфекции НЕ является правильным решением. Что вам следует сделать, так это настроить валидацию вашей модели, чтобы правильно заполнить cleaned_data формы. ВСЕ ЭТО ДОКУМЕНТИРУЕТСЯ, поэтому, пожалуйста, прочтите FineManual и научитесь правильно пользоваться своими инструментами. - person bruno desthuilliers; 21.09.2018
comment
на самом деле эта форма будет заполнена только администратором. В этой ситуации нет случая взлома, так как среда эта форма будет заполнена. так что не беспокойтесь о взломе - person ANISH TIWARI; 21.09.2018
comment
настоящая проблема в том, что мой ответ json не сохраняется. Я обновил код n трассировки стека @bruno - person ANISH TIWARI; 21.09.2018
comment
В любом случае, зачем вам сохранять JsonResponse в базе данных ??? Это вне моего воображения ... Просто сохраните сам json. И я уже отвечал о том, почему у вас в jsonvalue() было исключение. - person bruno desthuilliers; 21.09.2018
comment
на самом деле это сформированное будет заполнено только администратором. В этой ситуации нет никакого взлома = ›Боюсь, вы слишком уверены, особенно когда ваше представление не проверяет, кто публикует. Но что ж, это ваша проблема, если вас взломают. - person bruno desthuilliers; 21.09.2018
comment
Давайте продолжим это обсуждение в чате. - person ANISH TIWARI; 21.09.2018