代码之家  ›  专栏  ›  技术社区  ›  Josh Reich

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

  •  19
  • Josh Reich  · 技术社区  · 15 年前

    我将一系列对象序列化为:

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

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

    除了咀嚼输出json,正确的方法是什么 serializers.serialze() 不包括主键?

    7 回复  |  直到 7 年前
        1
  •  16
  •   Josh Reich    15 年前

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

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

    再打字一点,但效果不错。

        2
  •  8
  •   nonameentername    13 年前

    乔希所做的,只是倒退:

    data = json.loads(json_string)
    
    for d in data:
        del d['pk']
        del d['model']
    
    data = json.dumps(data)
    

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

        3
  •  7
  •   Community CDub    8 年前

    您还可以重写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)
    
        4
  •  3
  •   philipk    15 年前

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

    不幸的是,Django序列化程序提供的定制与您定义的相当少。我的解决方案是,如果你知道你将在你的项目中使用大量的序列化,只需将Django的序列化资料复制到我自己的项目中并做一些小的更改。这不太理想,但它确实起作用。具体来说,要删除pk,start_对象(self,obj)中有一行:

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

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

    希望这能帮助别人。

        5
  •  1
  •   dev.gabriel.lima    7 年前

    我也有同样的问题,所以我创造了自己的 Serializer ,从Django的序列化程序继承。 我只想要字段的数据,所以我覆盖了该方法 get_dump_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)
    
        6
  •  0
  •   S.Lott    15 年前

    我们不会浪费时间来“清理”pk。当我们生成一个JSON记录时,pk就在那里,用户可以根据需要忽略它。他们不能对这些信息做任何事情,所以只是杂乱无章。

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

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

        7
  •  0
  •   Bruno Barbieri    13 年前

    丑陋的(但工作的)方式:

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