Я пытаюсь провести livesearch с Django и jQuery. Что я сделал, так это заставил javascript запрашивать некоторые данные с помощью функции getJSON, затем я настроил представление в Django, которое возвращает ответ JSON, автоматизированный сериализатором Django.
И это хорошо работает, он возвращает ответ json с типом содержимого text / javascript. Чтобы не отправлять все данные (много, что мне не нужно), я сделал следующее:
response.write(serializers.serialize("json", soknad_list, fields=('name', 'image', 'genre')))
Но, например, поле «жанр» является полем manyToMany, поэтому можно ли получить значения, например, из genre.all.0, а не только из идентификатора жанра?
А в модели есть функция get_absolute _url, можно ли включить ее в ответ JSON, если да, то как?
Итак, я предполагаю, что мой вопрос: можно ли включить что-то, кроме необработанных данных поля, в ответ JSON, если нет, как вы подойдете к решению моей проблемы?





Сериализация JSON в Django основана на simplejson, который вы можете использовать напрямую и расширять по желанию для обработки любых типов объектов. Таким образом, у вас в основном есть два варианта: либо вручную создать список dicts с соответствующими данными и передать его в simplejson.dumps () (который по умолчанию поддерживает строки, списки, dicts и числа), либо написать свой собственный кодировщик json, который знает, как для сериализации вашего конкретного набора данных. FWIW, вот (не очень хорошо протестированный, но пока работавший) кодировщик json с поддержкой модели Django:
from django.utils import simplejson
from django.utils import datetime_safe
from django.utils.functional import Promise
from django.utils.translation import force_unicode
from django.utils.encoding import smart_unicode
from django.core.serializers.json import DjangoJSONEncoder
class ModelJSONEncoder(DjangoJSONEncoder):
"""
(simplejson) DjangoJSONEncoder subclass that knows how to encode fields.
(adated from django.serializers, which, strangely, didn't
factor out this part of the algorithm)
"""
def handle_field(self, obj, field):
return smart_unicode(getattr(obj, field.name), strings_only=True)
def handle_fk_field(self, obj, field):
related = getattr(obj, field.name)
if related is not None:
if field.rel.field_name == related._meta.pk.name:
# Related to remote object via primary key
related = related._get_pk_val()
else:
# Related to remote object via other field
related = getattr(related, field.rel.field_name)
return smart_unicode(related, strings_only=True)
def handle_m2m_field(self, obj, field):
if field.creates_table:
return [
smart_unicode(related._get_pk_val(), strings_only=True)
for related
in getattr(obj, field.name).iterator()
]
def handle_model(self, obj):
dic = {}
for field in obj._meta.local_fields:
if field.serialize:
if field.rel is None:
dic[field.name] = self.handle_field(obj, field)
else:
dic[field.name] = self.handle_fk_field(obj, field)
for field in obj._meta.many_to_many:
if field.serialize:
dic[field.name] = self.handle_m2m_field(obj, field)
return dic
def default(self, obj):
if isinstance(o, Promise):
return force_unicode(o)
if isinstance(obj, Model):
return self.handle_model(obj)
return super(ModelJSONEncoder, self).default(obj)
HTH
Я выяснил, что проще всего было вообще не использовать сериализатор. Я не знаю, почему я не подумал об этом раньше, но я просто использовал общее представление списка объектов и изменил тип mimetype на text / javascript и создал шаблон JSON на основе шаблона html.
Очень просто, и таким образом мне удалось получить все данные, которые я хотел, в ответ JSON. Таким образом, вы можете добавить все, что вы можете добавить в шаблон html, в ответ JSON, даже с разбивкой на страницы.
Пример извлечения созданного мной представления:
return object_list(request, queryset = object_list,
template_name = 'search/results.js', template_object_name = 'result',
paginate_by = 12, mimetype = 'text/javascript')
шаблонизация json - не лучшая идея, вам определенно следует использовать библиотеку сериализации json
Существует удобное стороннее приложение / сериализатор django, которое позволит вам включать дополнительные данные. Он также позволяет включать отношения модели и исключать список полей.
Это доступно на http://code.google.com/p/wadofstuff/wiki/DjangoFullSerializers
Привет, спасибо, я обязательно попробую это, большое спасибо! Я вернусь к вам, если у меня получится.