Объект типа QuerySet не сериализуем в формате JSON - PullRequest
1 голос
/ 14 марта 2019

У меня есть список объектов, которые можно вызывать по имени.У них есть числовые значения, которые могут вводить пользователи.Как бы я повернул каждый из этих списков, чтобы сформировать диаграмму, которую js может визуализировать?Я попытался с этим: Django Queryset диктовать для использования в json , но не смог заставить его работать.Получение «Объект типа QuerySet не является сериализуемым JSON».Диаграмма JS должна иметь собственную строку для каждого из этих списков и отображать значения в этих строках.Вот как далеко я зашел по ссылке в просмотров :

Сначала я получаю все списки пользователей:

user_lists = List.objects.filter(user=user)

Затем я получаю числовые значения для каждого списка

list_data = {}
for list in user_lists:
    list_data[list.name] = DataItem.objects.filter(list=list)

Здесь я застреваю, когда мне нужно преобразовать эти списки во что-то, что может понять chart.js ..

list_data_json = json.dumps(list_data, cls=DjangoJSONEncoder)

Кстати, я на правильном пути, чтобы превратить это преобразование в представления, верно?или он принадлежит где-то еще?

Не знаю, нужны ли они, но вот модели для этих списков и элементов данных в них:

class List(models.Model):
    name = models.CharField(max_length=100, default="")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='lists')

def __str__(self):
    return self.name

class Meta:
    unique_together = ['name', 'user']


class DataItem(models.Model):
    data = models.IntegerField(default=0)
    list = models.ForeignKey(List, on_delete=models.CASCADE, related_name='data_items')

EDIT выходной набор запросов выглядит следующим образом (вот что пытается прочитать json.dumps):

<QuerySet [{'name': 'squat', 'data_items__data': 1}, {'name': 'deadlift', 'data_items__data': 55}, {'name': 'Chest', 'data_items__data': None}, {'name': 'asd', 'data_items__data': 444}, {'name': 'asd', 'data_items__data': 32342}, {'name': 'asd', 'data_items__data': 42342}]>

И для меня это выглядит неплохо, есть список списков и списокимеет имя «приседания», а затем значения.Но снова получаю эту ошибку «Объект QuerySet не вызывается»

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Если вы знаете, какие поля вы хотите передать в chart.js, вы можете выполнить специальный запрос values(), чтобы получить словарь, который вы можете легко сериализовать с json.dumps, более или менее так:

user_lists = (List.objects
    .filter(user=user)
    .select_related('user')
    .prefetch_related('data_items')
    .values('user__username', 'data_items__data')  # all fields you need
)

list_data_json = json.dumps(list(user_lists))
0 голосов
/ 14 марта 2019

, несмотря на то, что можно было ожидать, DjangoJSONEncoder не обрабатывает наборы запросов и экземпляры моделей ( см. Здесь для типов, с которыми имеет дело DjangoJSONEncoder) - эта часть фактически обрабатывается самим сериализатором, ноСериализатор ожидает Queryset, а не набор запросов.

IOW, вам придется написать собственный кодер (на основе DjangoJSONEncoder) для обработки наборов запросов и моделей (подсказка: someobj.__dict__ возвращает атрибуты объекта как диктовку, которую вы можете отфильтровать, чтобы удалить ненужные вещи django, такие как _state)

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