2012-03-10 2 views
1

Я спросил related question earlier todayПреобразование нескольких querysets в JSON в Джанго

В этом случае, у меня есть 4 результатов QuerySet:

action_count = Action.objects.filter(complete=False, onhold=False).annotate(action_count=Count('name')) 
hold_count = Action.objects.filter(onhold=True, hold_criteria__isnull=False).annotate(action_count=Count('name')) 
visible_tags = Tag.objects.filter(visible=True).order_by('name').filter(action__complete=False).annotate(action_count=Count('action')) 
hidden_tags = Tag.objects.filter(visible=False).order_by('name').filter(action__complete=False).annotate(action_count=Count('action')) 

Я хотел бы, чтобы вернуть их к функции AJAX. Мне нужно преобразовать их в json, но я не знаю, как включить несколько запросов в одну и ту же строку json.

ответ

1

Вы можете использовать простой модуль Django. Этот код не проверен!

from django.utils import simplejson 
dict = { 
    'action_count': list(Action.objects.filter(complete=False, onhold=False).annotate(action_count=Count('name')).values()), 
    'hold_count': list(Action.objects.filter(onhold=True, hold_criteria__isnull=False).annotate(action_count=Count('name')).values()), 
    ... 
} 
return HttpResponse(simplejson.dumps(dict)) 

Я буду проверять и переписывать код по мере необходимости, когда у меня есть время, но это должно вас начать.

+3

Это не будет реально работать. Вы не можете сериализовать такой набор запросов Django, потому что сами экземпляры модели не могут быть сериализованы непосредственно модулем 'json'. –

+0

Хорошо, спасибо за подсказку! Я просто переписал код. Теперь фактические списки словарей создаются «на лету». Он должен работать, но он все еще не проверен. Возможно, это не самый элегантный способ ... –

+0

Вы можете использовать ['values ​​()'] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#values) или ['values_list () '] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list) вместо того, чтобы создавать словари таким образом, особенно, если любой из поля - это ForeingKey или что-то, что оно снова вернет неэриализуемый объект. 'json.dumps (list (Model.object.filter(). values ​​()))' например. –

2

Я знаю, что эта ветка устарела, но с помощью simplejson для преобразования моделей django не работает во многих случаях, таких как десятичные знаки (как отмечено в ребусе выше).

Как указано в документации django, сериализатор выглядит как лучший выбор.

Структура сериализации Django обеспечивает механизм для «перевод» моделей Django в другие форматы. Обычно эти другие форматы будут на основе текста и использованы для отправки данных Django по проводке , но сериализатор может обрабатывать любой формат (текстовый или нет).

Django Serialization Docs

Смежные вопросы