从django序列化对象中删除pk字段

时间:2009-10-23 20:13:16

标签: django json serialization

我正在使用以下代码序列化一堆对象:

json = serializers.serialize("json", objects, fields=('name', 'country'))

我没有在我的字段列表中包含'pk',但生成的JSON包含每个序列化对象的主键。我不希望我的API向主要公众公开主键。

没有重复输出JSON,告诉serializers.serialze()不包含主键的正确方法是什么?

7 个答案:

答案 0 :(得分:17)

我最后通过“手动”使用基础simplejson序列化程序实现我想要的工作来解决这个问题:

from django.utils import simplejson
json = simplejson.dumps( [{'name': o.name,
                           'country': o.country} for o in objects] )

多点打字,但有效。

答案 1 :(得分:8)

Josh做了什么但倒退了:

data = json.loads(json_string)

for d in data:
    del d['pk']
    del d['model']

data = json.dumps(data)

这样,您在将来添加更多字段时无需担心更新代码。

答案 2 :(得分:7)

您也可以按照此处的说明覆盖JSON序列化程序:Override Django Object Serializer to get rid of specified model

from django.core.serializers.json import Serializer, DjangoJSONEncoder
from django.utils import simplejson

import logging

class MySerializer(Serializer):
    def end_serialization(self):
        cleaned_objects = []

        for obj in self.objects:
            del obj['pk']
            cleaned_objects.append(obj)

        simplejson.dump(cleaned_objects, self.stream, cls=DjangoJSONEncoder, **self.options)

答案 3 :(得分:3)

虽然这是一个老问题,但其他人可能会在Google搜索中提出这个问题。

不幸的是,django序列化程序提供的定制很少,就像你定义的那样。我的解决方案,如果您知道将为您的项目使用大量序列化,只需将django的序列化内容复制到我自己的项目中并进行一些小的更改。这不是理想的,但它可以完成这项工作。具体来说,要删除pk,start_object中有一行(self,obj):

self.xml.startElement("object", {
        "pk"    : smart_unicode(obj._get_pk_val()),
        "model" : smart_unicode(obj._meta),
    })

删除“pk”行应修复它。这是一个有点脏的黑客,因为如果他们稍后改进它可能需要对你的观点进行一些改变,但对我来说这是围绕这些限制的最简单方法。

希望这有助于某人。

答案 4 :(得分:1)

我遇到了同样的问题,所以我创建了自己的new Promise( /* executor */ function(resolve, reject) { ... } );,继承自Django的Serializer。 我只想要字段数据,因此我会覆盖方法Serializer,并添加了PK字段。

get_dump_object

并致电:

from django.core.serializers.json import Serializer


class JSONSerializer(Serializer):
    def get_dump_object(self, obj):
        self._current[obj._meta.pk.name] = obj._get_pk_val()
        return self._current

答案 5 :(得分:0)

我们不会浪费时间试图“消毒”PK。当我们生成JSON记录时,PK就在那里,用户可以根据需要忽略它。他们无法对信息做任何事情,所以这只是一团糟。

我们的所有网络服务界面都不允许任何人向我们提供PK。我们对其他字段进行POST,PUT和DELETE搜索,但不进行PK。

然而,HTML会始终显示PK的URL。它允许人们为页面添加书签。

答案 6 :(得分:0)

丑陋(但有效)的方式:

data_tmp = data.split('{')
#Gets all the data after fields
response = "[{"+data_tmp[2].replace("}}","}",1)
相关问题