【问题标题】:Django response error 'unicode' object has no attribute '_meta' jsonDjango 响应错误“unicode”对象没有属性“_meta”json
【发布时间】:2019-02-25 15:20:36
【问题描述】:

我正在使用 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)

_get_response 中的文件“C:\Python27\lib\site-packages\django\core\handlers\base.py” 187. response = self.process_exception_by_middleware(e, request)

_get_response 中的文件“C:\Python27\lib\site-packages\django\core\handlers\base.py” 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)

posttodb 中的文件“C:\Users\admin\Desktop\SREC_OBA\cbcsportal\views.py” 34. data.renderJSON = jsonvalue(请求)

jsonvalue 中的文件“C:\Users\admin\Desktop\SREC_OBA\cbcsportal\views.py” 21. ds = serializers.serialize('json', d)

序列化中的文件“C:\Python27\lib\site-packages\django\core\serializers__init__.py” 129. s.serialize(查询集,**选项)

序列化中的文件“C:\Python27\lib\site-packages\django\core\serializers\base.py” 84.concrete_model = obj._meta.concrete_model

异常类型:/cbcs/posttodb 处的 AttributeError 异常值:“unicode”对象没有属性“_meta”

【问题讨论】:

  • 添加完整的堆栈跟踪
  • 添加了堆栈回溯@YogeshMhaskule

标签: django django-models django-views django-1.11 django-jsonfield


【解决方案1】:

这里:

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

您正在将 dict 传递给 serialize()。 Django 序列化程序用于序列化 django 的 orm 查询集(这是有文档的,您可以通过阅读回溯来发现)。

将python dict序列化为json的正确方法是使用json.dumps(yourdict)。但是:在你的情况下,这无论如何都没用,因为JsonResponse expects a python dict as first argument 并且会处理序列化。此外,您不需要设置内容类型,它已经是 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 负责验证和清理。

【讨论】:

  • 谢谢@bruno,但我已经尝试过了,但我无法将它保存到数据库。这样做时我得到 is not JSON serializable 错误
  • @ANISHTIWARI 没有匹配代码的回溯是完全没用的,但是请注意:绕过验证和清理不是正确的解决方案。您应该做的是自定义您的模型表单的验证以正确填写表单的cleaned_data。所有这些都已记录在案,因此请阅读 FineManual 并学会正确使用您的工具。
  • 实际上这个表格只会由管理员填写。在这种情况下没有任何黑客攻击的情况,因为这个表格将被填写。所以不用担心黑客攻击
  • 真正的问题是我的 json 响应没有保存。我已经更新了代码 n 堆栈回溯 @bruno
  • 你为什么要在数据库中保存一个 JsonResponse ???这超出了我的想象......只需保存 json 本身。我已经回答了为什么你在jsonvalue() 中有一个例外。
猜你喜欢
  • 2016-05-19
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2020-07-05
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多