Удалить поле pk из сериализованных объектов django - PullRequest
19 голосов
/ 24 октября 2009

Я сериализую группу объектов с:

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

Я не включил 'pk' в свой список полей, но созданный JSON включает первичный ключ с каждым сериализованным объектом. Я не хочу, чтобы мой API выставлял первичные ключи широкой публике.

Если не считать выходной JSON, как правильно сказать serializers.serialze() не включать первичный ключ?

Ответы [ 7 ]

17 голосов
/ 24 октября 2009

В итоге я обошел это, «вручную» добившись того, что хотел, используя базовый сериализатор simplejson:

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

Немного больше печатать, но работает.

8 голосов
/ 25 июня 2012

Что сделал Джош, но в обратном направлении:

data = json.loads(json_string)

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

data = json.dumps(data)

Таким образом, вам не нужно беспокоиться об обновлении кода при добавлении новых полей в будущем.

7 голосов
/ 08 июня 2011

Вы также можете переопределить сериализатор JSON, как описано здесь: Переопределить сериализатор объектов Django, чтобы избавиться от указанной модели

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 голосов
/ 16 января 2010

Хотя это старый вопрос, вероятно, кто-то другой придет с ним в поиске Google.

К сожалению, сериализатор django предлагает довольно мало настроек, как вы определили. Мое решение, если вы знаете, что вы будете использовать много сериализации для своего проекта, было просто скопировать материал сериализации django в мой собственный проект и внести некоторые небольшие изменения. Это не идеально, но это делает работу. В частности, чтобы удалить ПК, в start_object (self, obj) есть строка:

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

Удаление строки "pk" должно исправить это. Это несколько грязный хак, потому что если они улучшат это позже, это может потребовать некоторых изменений в ваших взглядах, но для меня это был самый простой способ обойти ограничения.

Надеюсь, это кому-нибудь поможет.

1 голос
/ 15 августа 2017

У меня была такая же проблема, поэтому я создал свое собственное Serializer наследование от 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)
0 голосов
/ 02 ноября 2011

Уродливый (но работающий) способ:

data_tmp = data.split('{')
#Gets all the data after fields
response = "[{"+data_tmp[2].replace("}}","}",1)
0 голосов
/ 24 октября 2009

Мы не тратим время, пытаясь «санировать» ПК. Когда мы создаем JSON-запись, в ней есть PK, и пользователь может игнорировать его, если захочет. Они ничего не могут сделать с информацией, так что это просто беспорядок.

Ни один из наших интерфейсов веб-сервисов не позволяет никому возвращать нам PK. Мы выполняем поиск POST, PUT и DELETE в других полях, но не в PK.

HTML, тем не менее, показывает, что PK - это URL. Это позволяет людям создавать закладки для страниц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...