Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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
从django序列化对象中删除pk字段_Django_Json_Serialization - Fatal编程技术网

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

从django序列化对象中删除pk字段,django,json,serialization,Django,Json,Serialization,我正在使用以下命令序列化一组对象: json = serializers.serialize("json", objects, fields=('name', 'country')) 我的字段列表中没有包含“pk”,但生成的JSON包含每个序列化对象的主键。我不希望我的API向公众公开主键 除了输出JSON,告诉序列化程序.serialize()不包含主键的正确方法是什么?我们不会浪费时间来“清理”PK。当我们生成一个JSON记录时,PK就在那里,如果用户愿意,可以忽略它。他们无法处理这些信息

我正在使用以下命令序列化一组对象:

json = serializers.serialize("json", objects, fields=('name', 'country'))
我的字段列表中没有包含“pk”,但生成的JSON包含每个序列化对象的主键。我不希望我的API向公众公开主键


除了输出JSON,告诉序列化程序.serialize()不包含主键的正确方法是什么?

我们不会浪费时间来“清理”PK。当我们生成一个JSON记录时,PK就在那里,如果用户愿意,可以忽略它。他们无法处理这些信息,所以它们只是杂乱无章

我们的web服务接口都不允许任何人向我们提供PK。我们在其他字段上发布、放置和删除搜索,但不包括PK


然而,HTML始终显示PK的URL。它可以让人们为页面添加书签。

我最终通过使用底层的
simplejson
序列化程序“手动”实现了我想要的:

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

再多输入一点,但效果很好。

虽然这是一个老问题,但可能会有其他人在谷歌搜索中找到它

不幸的是,django序列化程序提供的定制很少,就像您定义的那样。如果您知道您的项目将使用大量序列化,那么我的解决方案就是将django的序列化内容复制到我自己的项目中,并进行一些小的更改。这并不理想,但它确实起到了作用。具体来说,要删除主键,在start_对象(self,obj)中有一行:

删除“pk”行应该可以修复它。这是一个有点肮脏的黑客,因为如果他们以后改进它,可能需要对您的视图进行一些更改,但对我来说,这是绕过限制的最简单的方法


希望这对某人有所帮助。

您也可以覆盖JSON序列化程序,如下所述:

丑陋(但有效)的方式:


Josh做了些什么,但没有后退:

data=json.load(json_字符串)
对于数据中的d:
德尔d['pk']
del d[“模型”]
data=json.dumps(数据)

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

我也有同样的问题,所以我创建了自己的
序列化程序
,从Django的序列化程序继承。 我只想要字段的数据,所以我覆盖了方法
get\u dump\u object
,并添加了PK字段

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
并致电:

output = JSONSerializer().serialize(queryset)

许多公司都认为顺序主键中不包含任何信息。如果你的访问控制被锁定了,没什么好担心的,对吧?错。至少,显示顺序标识符为竞争对手跟踪您的增长提供了一个很好的方法。有一个相当大的行业,简单的基于查找顺序ID和销售增长估计。您可以使用UUID而不是顺序ID来解决问题,因此公开给竞争对手不会提供任何信息。也可以考虑在PK和模型被包含时发送给每个用户的额外文本。这是可以非常明显地节省的带宽(特别是当发送给移动用户时)。如果您只想将一些数据转储到json,而不关心FK,这是一个很好的解决方案。@Josh如果您有28个方法,在一个API中使用5个模型,那么编码要多得多。我已经使用过这个。但是当你在几个视图中使用它时,会很麻烦。最好使用Django的序列化程序。最后一个答案有一个相关问题的链接,该问题解释了如何从它生成的对象中删除pk和model字段。@Josh Reich你最后在这个问题上做了什么?有一张票是关于它的,我最后手动给simplejson打了电话谢谢!这个问题的答案帮助很大!
data_tmp = data.split('{')
#Gets all the data after fields
response = "[{"+data_tmp[2].replace("}}","}",1)
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
output = JSONSerializer().serialize(queryset)