#python #json #django #jsonserializer #django-sessions
#python #json #django #jsonserializer #django-сеансы
Вопрос:
У меня есть один сеанс типа словаря с именем ‘cart’, и он работает нормально, пока я не добавлю еще один сеанс целочисленного типа с именем ‘com_order_id’ в мой django request.session. Ошибка >>> TypeError у объекта типа Product не является сериализуемым в формате JSON.
Вот примерное значение сеанса:
{'com_order_id': 59, 'cart': {'3': {'quantity': 1, 'product': <Product: Christmas With Prestige>, 'total_price': 30000, 'total_weight': Decimal('2.30')}}}
Если я удалю один из них, он сработает. Однако сохранение значений ‘cart’ и ‘com’ приводит к ошибке.
Комментарии:
1. Вы не можете сохранить
Product
. Это модель Django, но сеансы хранятся в виде большого двоичного объекта JSON (по умолчанию). Поскольку модель Django не является словарем, строкой, int и т. Д., Это приводит к сбою. Вы можете, например, сохранить первичный ключ , но неProduct
сам по себе.2. Привет, Виллем, я понимаю, на что ты указываешь. Я сохранил продукт в сеансе и использовал, и он работал, пока я не добавил этот ‘com_order_id’ в этот сеанс.
3. Вероятно, вы никогда не сохранялись
Product
в сеансе, а не то, что если вы отредактируете JSON на несколько слоев глубже, обновление не будет «пульсировать», и, следовательно, Django не знает, что вы обновили сеансы. Django может видеть только «внешнюю оболочку».4. можете ли вы проверить, что без
com_order_id
, вы сохранилиPost
объект: чтобы вы могли получить его в другом представлении?5. но это не JSON, это словарь Python, вы можете увидеть это по одиночным кавычкам. Идея заключается в том, что Django автоматически сериализует его в большой двоичный объект JSON и десериализует его в объекты Python. Таким образом, не потому, что вы печатаете
request.SESSIONS
, это в конечном итоге будет сохранено, потому что, когда вы «покидаете» представление, происходит сериализация. Что еще хуже, если вы не заменяете объект, то это все тот же объект, поэтому нельзя узнать, изменили ли вы что-то внутри этого объекта.