Подтвердить что ты не робот

Удалить поле pk из сериализованных объектов django

Я сериализую кучу объектов с помощью:

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

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

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

4b9b3361

Ответ 1

Я закончил работу над этим, "вручную", достигнув того, что хотел, используя базовый сериализатор simplejson:

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

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

Ответ 2

То, что сделал Джош, но назад:

data = json.loads(json_string)

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

data = json.dumps(data)

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

Ответ 3

Вы также можете переопределить сериализатор 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)

Ответ 4

Хотя это старый вопрос, кто-то, возможно, придумает его в поиске 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" должно исправить ее. Это несколько грязный хак, поскольку, если они улучшат это позже, это может потребовать некоторых изменений в ваших взглядах, но для меня это было самым простым способом ограничения.

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

Ответ 5

У меня была та же проблема, поэтому я создал собственное 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)

Ответ 6

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

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

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

Ответ 7

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

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