Django Formset not JSON Сериализуемый - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь передать набор данных как JSON данные, но получаю Object of type HabitFormFormSet is not JSON serializable.

Почему это так?

мой взгляд:

def modal_view(request):
    HabitFormSet = modelformset_factory(
        Habit, extra=0, form=HabitModelForm)
    formset = HabitFormSet(
        request.POST,
        queryset=Habit.objects.filter(user=request.user),
    )
    if formset.is_valid():
        formset.save()
        data = {"formset": formset}
        return JsonResponse(data)

    return HttpResponseRedirect(reverse('home'))

Если я использую список словарей, я получаю Object of type Habit is not JSON serializable:

    if formset.is_valid():
        formset.save()
        formlist = list()
        for form in formset:
            formlist.append(form.cleaned_data)
        data = {"formlist": formlist}
        return JsonResponse(data)

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Для пользовательских классов по умолчанию нет JSON сериализации.

Возможно, вы захотите добавить, скажем, to_json() или as_json() (выберите одну) функцию к вашей модели Habit, например

def to_json(self):
    return {
        "id": self.id,
        "something": self.something,
    }

Затем составьте список (недавно сохраненных) привычек:

data = {"new_habits": [form.instance.to_json() for form in formset if form.instance.id]}
return JsonResponse(data)
1 голос
/ 06 апреля 2020

Встроенный JSONEncoder имеет стратегию сериализации каждого python примитивного типа , но он не знает, как сериализовать ваши пользовательские типы (особенно экземпляры ваших пользовательских классов).

Вы можете написать свой собственный JSONEncoder подкласс и сказать JsonResponse, чтобы использовать его

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