Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django:控件json序列化_Python_Django_Json_Serialization - Fatal编程技术网

Python django:控件json序列化

Python django:控件json序列化,python,django,json,serialization,Python,Django,Json,Serialization,有没有办法控制django中的json序列化?下面的简单代码将返回json格式的序列化对象: co = Collection.objects.all() c = serializers.serialize('json',co) json将类似于以下内容: [ { "pk": 1, "model": "picviewer.collection", "fields": { "urlName": "architectur

有没有办法控制django中的json序列化?下面的简单代码将返回json格式的序列化对象:

co = Collection.objects.all()
c = serializers.serialize('json',co)
json将类似于以下内容:

[
    {
        "pk": 1,
        "model": "picviewer.collection",
        "fields": {
            "urlName": "architecture",
            "name": "\u0413\u043e\u0440\u043e\u0434 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430",
            "sortOrder": 0
        }
    },
    {
        "pk": 2,
        "model": "picviewer.collection",
        "fields": {
            "urlName": "nature",
            "name": "\u041f\u0440\u0438\u0440\u043e\u0434\u0430",
            "sortOrder": 1
        }
    },
    {
        "pk": 3,
        "model": "picviewer.collection",
        "fields": {
            "urlName": "objects",
            "name": "\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043d\u0430\u0442\u044e\u0440\u043c\u043e\u0440\u0442",
            "sortOrder": 2
        }
    }
]
您可以看到,它以一种可以重新创建整个模型的方式对其进行序列化,您是否希望在某个时候这样做?这很公平,但对于简单的JS ajax来说并不十分方便。在我的例子中:我希望将通信量降到最低,并使整个过程更加清晰

我所做的是创建了一个视图,将对象传递给.json模板,该模板将执行以下操作以生成更好的json输出:

[
{% if collections %}
    {% for c in collections %}
{"id": {{c.id}},"sortOrder": {{c.sortOrder}},"name": "{{c.name}}","urlName": "{{c.urlName}}"}{% if not forloop.last %},{% endif %}
    {% endfor %}
{% endif %}
]
这确实有效,而且输出效果更好:

[
    {
        "id": 1,
        "sortOrder": 0,
        "name": "Город и архитектура",
        "urlName": "architecture"
    },
    {
        "id": 2,
        "sortOrder": 1,
        "name": "Природа",
        "urlName": "nature"
    },
    {
        "id": 3,
        "sortOrder": 2,
        "name": "Объекты и натюрморт",
        "urlName": "objects"
    } 
]
然而,我的解决方案使用模板的速度太快了,这在处理过程中是一个额外的步骤,可能会对性能产生影响。例如,如果我要更新模型,则需要手工维护

我认为json生成应该是模型的一部分,如果我错了,并且已经完成了本地python json和django实现,但是我不知道如何让它去掉我不想要的部分,请纠正我


还有一件事——即使我将其限制为一组要序列化的字段,它也会将id始终保持在元素容器之外,而不是在元素容器之外以pk的形式呈现

我建议您使用来编码数据,而不是自己构造类似json的字符串。首先,上面的代码似乎无法正确处理转义。除了bug之外,编写自己的序列化程序没有什么好处。

我建议您使用它来编码数据,而不是自己构造类似json的字符串。首先,上面的代码似乎无法正确处理转义。除了bug之外,编写自己的序列化程序没有什么好处。

与其自己编写任何东西,不如将Django模型序列化为JSON。默认情况下,它只是序列化模型的字段,没有元数据。您还可以轻松列出要包括或排除的字段,甚至是相关字段。没有额外的模板,视图代码很少。

与其自己编写任何东西,不如将Django模型序列化为JSON。默认情况下,它只是序列化模型的字段,没有元数据。您还可以轻松列出要包括或排除的字段,甚至是相关字段。没有额外的模板,而且视图代码很少。

这真的很容易。快速示例:

from django.http import HttpResponse
from django.utils import simplejson

def simple_view(request):
    response = {'string': "test",
                'number': 42,
                'array': [1, 2, 3],
                'js_object': dict(foo="bar")}
    return HttpResponse(simplejson.dumps(response),
                        mimetype="application/json")
此视图将返回与以下JSON等效的内容:

{"string": "test",
 "number": 42,
 "array": [1, 2, 3],
 "js_object": {foo: "bar"}}

编辑:是的,阿萨夫·拉维是对的,你的模板可能会抛出无效的JSON。

这真的很容易。快速示例:

from django.http import HttpResponse
from django.utils import simplejson

def simple_view(request):
    response = {'string': "test",
                'number': 42,
                'array': [1, 2, 3],
                'js_object': dict(foo="bar")}
    return HttpResponse(simplejson.dumps(response),
                        mimetype="application/json")
def view( request):
    m_all = list(model.objects.all().values())

    return HttpResponse(simplejson.dumps(m_all))
此视图将返回与以下JSON等效的内容:

{"string": "test",
 "number": 42,
 "array": [1, 2, 3],
 "js_object": {foo: "bar"}}
编辑:是的,阿萨夫·拉维是对的,你的模板可能会抛出无效的JSON

def view( request):
    m_all = list(model.objects.all().values())

    return HttpResponse(simplejson.dumps(m_all))
这应该可以解决问题。 使用值并转换为列表应该会产生您想要的结果

这应该可以解决问题。
使用值并转换为列表应该会产生您想要的结果。

这对数组有效,但我不认为django模式可以通过这种方式序列化。我认为他是在暗示您应该将字段从您想要的模型对象复制到JSON可序列化类型,如list或dict.obj=Collection.objects.getpk=1;simplejson.dumpsdicturlName=obj.urlName,name=obj.name,sortOrder=obj.sortOder。但就像在,活塞可以为您完成这一步:这或多或少需要一些手动预处理——一些模型字段不能由simplejson序列化,我必须将它们转换为字符串:这适用于数组,但我认为django模式不能以这种方式序列化。我想他是在暗示您应该从所需的模型对象复制字段转换为JSON可序列化类型,如list或dict.obj=Collection.objects.getpk=1;simplejson.dumpsdicturlName=obj.urlName,name=obj.name,sortOrder=obj.sortOder。但就像在中一样,活塞可以为您完成这一步:这或多或少需要一些手动预处理-一些模型字段不能由simplejson序列化,我必须将它们转换为字符串:活塞似乎不受支持-上一个代码在6个月前提交,问题似乎没有得到回复/解决。公平。我已经在一个公司内部项目中使用了它,成功地完成了您所需要的工作,但有时我不得不解决长期存在的bug。另一种选择是,如果你想要新的热点,去看看。有一个社区分叉正在进行中,得到了《活塞》作者jesper的批准。也就是说,你应该安装在许多分叉中的一个,关闭一些打开的bug。例如,我的,活塞似乎不受支持-上一个代码在6个月前提交,问题似乎没有得到回复/解决。公平。我已经在一个公司内部项目中使用了它,成功地完成了您所需要的工作,但有时我不得不解决长期存在的bug。另一种选择是,如果你想要新的热度,去看看吧。有一个社区分岔正在进行中,得到了jesper的批准 活塞的作者。也就是说,你应该只安装在许多叉子上,关闭一些打开的臭虫。比如我的,,