Python 我想回到JSON

Python 我想回到JSON,python,json,django,Python,Json,Django,它是UserProfileclass UserProfile模型扩展了AbstractUser class UserProfile(AbstractUser): created_at = models.DateTimeField(auto_now_add=True) modified_at = models.DateTimeField(auto_now=True) 这个代码不起作用,我也不知道为什么 变量用户工作。但是变量user1不起作用 def get_rank(request):

它是
UserProfile
class

UserProfile
模型扩展了
AbstractUser

class UserProfile(AbstractUser):
created_at = models.DateTimeField(auto_now_add=True)
modified_at = models.DateTimeField(auto_now=True)
这个代码不起作用,我也不知道为什么

变量
用户
工作。但是变量
user1
不起作用

def get_rank(request):
    users1 = UserProfile.objects.all().order_by('created_at')
    # below code works but variable 'users1' don't work.
    # I want users to JSON. ex) users
    users = '[{"item":"NEFUS"},{"item":"Layer7"},{"item":"Unifox"},{"item":"Focus"},{"item":"Frs"}]'
    return HttpResponse(users , content_type='application/json')
这是AJAX代码

function ajax_get_rank() {
    var temp = new XMLHttpRequest();
    temp.open("GET","/get_rank/");
    temp.onreadystatechange = function() {
        if (temp.readyState === 4 && temp.status === 200) {
            get_rank(temp.responseText);
        }
    }
    temp.send();
}
函数获取秩(秩数组温度){
var temp=JSON.parse(rank\u array\u temp);
对于(变量i=0;i
这是主要的javascript代码


任何帮助都将不胜感激。

您不能直接序列化django模型对象,这样做您将得到
TypeError:queryset不是JSON可序列化的
错误

但您可以使用
获取要显示的字段集合,然后将其序列化:

function get_rank(rank_array_temp) {
    var temp = JSON.parse(rank_array_temp);
    for( var i = 0 ; i < temp.length; i++) {
        var div_temp = document.createElement("div");
        div_temp.className = "rank"
        var out = "";
        out += "\
            <div class = 'rank'>\
                <span class = 'grade'>\
                    <span>"+parseInt(i+1)+".</span>\
                </span>\
                <span class = 'item_name'>\
                    <span>"+temp[i].item+"</span>\
                </span>\
            </div>\
        ";

        div_temp.innerHTML = out;
        rank_list.appendChild(div_temp);
    }
}
请注意,
DateTime
Date
等字段不可json序列化。您需要的是:

profiles = UserProfile.objects.all().order_by('created_at') \
                                    .values('field1', 'field2')

users1 = json.dumps(profiles)

直接将对象序列化/反序列化为JSOn实际上不是一种好方法,因为:

  • 对象将有问题,因为它们没有关于如何将特定对象序列化为JSON的描述符
  • 当您尝试转换特殊类型(如
    Decimal
    )时,使用
    values
    values\u list
    会出现问题,因为JSON没有十进制类型
  • 可能的解决办法:

  • 困难的方法是用python创建列表或字典,然后将其序列化。您必须将特殊类型解析为基本类型,这些类型也是JSON数据的有效类型,例如将
    Decimal
    转换为
    float

    from django.core.serializers.json import DjangoJSONEncoder
    users1 = json.dumps(profiles, cls=DjangoJSONEncoder)
    
  • 或者正如@ShangWang所提到的,您可以使用
    djangojsonecoder
    对python特定类型进行编码,而不会出错

  • 用于序列化/反序列化。您可以专门化哪些字段将被序列化

    import json
    height = Decimal("1.78")
    my_dict = {"Name": "Jason", "Age": 16, height: float(height)}
    json.loads(my_dict)
    
  • Django序列化程序更易于使用,因为它们将把任何有效的python类型序列化为正确的JSON类型

    django序列化程序的输出如下:

    from django.core import serializers
    data = serializers.serialize("json", SomeModel.objects.all())
    
    data = serializers.serialize('json', SomeModel.objects.all(), fields=('name','size'))
    

    因此,您可以从每个JSON对象的
    fields
    键中获取字段和值。您可以查看文档以了解更多信息。

    您没有描述什么不起作用。您正在传递一个硬编码字符串;你到底想做什么?users1
    输出是什么样子的?user1=>[,等等]我想返回{0:“Nefus”,1:“Unifox”,2:“Layer7”,等等}或{“item”:“Nefus”,“item”:“Unifox”,“item”:“Layer7”,等等}怎么做?我不明白你评论中字典里的那些值是什么,也不知道整数。对不起,我做得不好。。。。。请理解我想要返回“[{item”:“Unifox”},{“item”:“Layer7”},{“item”:“Nefus”},等等]”
    [
        {
            "pk": "4b678b301dfd8a4e0dad910de3ae245b",
            "model": "sessions.session",
            "fields": {
                "expire_date": "2013-01-16T08:16:59.844Z",
                ...
            }
        }
    ]