Удалить поле pk из сериализованных объектов django
Я сериализую кучу объектов с помощью:
json = serializers.serialize("json", objects, fields=('name', 'country'))
Я не включил "pk" в свой список полей, но созданный JSON включает в себя первичный ключ с каждым сериализованным объектом. Я не хочу, чтобы мой API открывал первичные ключи для широкой публики.
Не дожидаясь выхода JSON, каков правильный способ сказать serializers.serialze()
не включать первичный ключ?
Ответы
Ответ 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)