Object of type Work is not JSON serializable
Делаю сайт автосервиса на django 4.1.7. У меня есть "две корзины", которые хранятся в сессии по разным ключам. В первой корзине хранятся товары, во второй услуги. При добавлении сначала товаров, а потом услуг, никаких ошибок нет. Если добавлять сначала услуги, то вылезает ошибка
Перепробовал уже все, что нашел, ничего не помогло.Соответственно, Work
- это модель. Она в принципе ничем не отличается от модели Autopart. Сама реализация корзины также одинакова, за исключением того, что услуги хранятся при количестве 1, а товары можно изменять.
Также до этого была ошибка:
Object of type Decimal is not JSON serializable
я изменил тип на float
для цены, вылезло это.
from _decimal import Decimal
from django.conf import settings
from work.models import Work
Реализация корзины для услуг:
class CartWork(object):
def __init__(self, request):
"""
Инициализируем корзину
"""
self.session = request.session
cart = self.session.get(settings.WORK_SESSION_ID)
if not cart:
# save an empty cart in the session
cart = self.session[settings.WORK_SESSION_ID] = {}
self.cart = cart
def add(self, product, quantity=1, update_quantity=False):
"""
Добавить продукт в корзину или обновить его количество.
"""
product_id = str(product.id)
if product_id not in self.cart:
self.cart[product_id] = {'quantity': 0,
'price': str(product.price)}
if update_quantity:
self.cart[product_id]['quantity'] = quantity
else:
self.cart[product_id]['quantity'] += quantity
self.save()
def save(self):
# Обновление сессии cart
self.session[settings.WORK_SESSION_ID] = self.cart
# Отметить сеанс как "измененный", чтобы убедиться, что он сохранен
self.session.modified = True
def remove(self, work):
product_id = str(work.id)
if product_id in self.cart:
del self.cart[product_id]
self.save()
def __iter__(self):
product_ids = self.cart.keys()
# получение объектов product и добавление их в корзину
products = Work.objects.filter(id__in=product_ids)
for product in products:
self.cart[str(product.id)]['product'] = product
print(type(product))
print("Сука для товаров")
for item in self.cart.values():
item['price'] = Decimal(item['price'])
item['total_price'] = item['price'] * item['quantity']
yield item
def __len__(self):
"""
Подсчет всех товаров в корзине.
"""
return sum(item['quantity'] for item in self.cart.values())
def get_total_price(self):
"""
Подсчет стоимости товаров в корзине.
"""
return sum(Decimal(item['price']) * item['quantity'] for item in
self.cart.values())
def clear(self):
# удаление корзины из сессии
del self.session[settings.WORK_SESSION_ID]
self.session.modified = True
файл view.py
@require_POST
def cartwork_add(request, product_id):
cartwork = CartWork(request)
product = get_object_or_404(Work, id=product_id)
form = CartAddWorksForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
cartwork.add(product=product, quantity=1)
return redirect('work:work_list')
def cartwork_remove(request, product_id):
cartwork = CartWork(request)
work = get_object_or_404(Work, id=product_id)
cartwork.remove(work)
return redirect('cartwork:cartwork_detail')
def cartwork_detail(request):
cartwork = CartWork(request)
for item in cartwork:
item['update_quantity_form'] = CartAddWorksForm(
initial={'quantity': 1, 'update': True})
return render(request, 'cartwork/cartWork_detail.html', {'cartwork': cartwork})
Источник: Stack Overflow на русском