我正在使用以下代码序列化一堆对象:
json = serializers.serialize("json", objects, fields=('name', 'country'))
我没有在我的字段列表中包含'pk',但生成的JSON包含每个序列化对象的主键。我不希望我的API向主要公众公开主键。
没有重复输出JSON,告诉serializers.serialze()
不包含主键的正确方法是什么?
答案 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)