简体   繁体   English

类型错误:十进制类型的 Object 不是 JSON 可序列化 | Django

[英]TypeError: Object of type Decimal is not JSON serializable | Django

I am getting quite unusual error.我收到了非常不寻常的错误。 I got pretty confused because of this.因此,我很困惑。 When I iterate over the cart items and try to view them it throws a TypeError Object of type Decimal is not JSON serializable.当我遍历购物车项目并尝试查看它们时,它会抛出一个 TypeError Object 类型的 Decimal is not JSON serializable。 But if i remove the block from my templates then refresh the page and again add the same block to my templates and refresh the page it works.但是如果我从我的模板中删除该块然后刷新页面并再次将相同的块添加到我的模板并刷新它工作的页面。 I have added some screenshots.我添加了一些屏幕截图。 Please have a look and help me out with this请看看并帮助我解决这个问题

cart.py

class Cart(object):
    def __init__(self, request):
        """
        Initialize the cart
        """
        self.session = request.session
        cart = self.session.get(settings.CART_SESSION_ID)

        if not cart:
            # save an empty cart in the session
            cart = self.session[settings.CART_SESSION_ID] = {}
        
        self.cart = cart

    def add(self, product, quantity=1, override_quantity=False):
        """
        Add a product to the cart or update its quantity
        """
        product_id = str(product.id)

        if product_id not in self.cart:
            self.cart[product_id] = {
                'quantity': 0,
                'price': str(product.price)
            }
        
        if override_quantity:
            self.cart[product_id]['quantity'] = quantity
        else:
            self.cart[product_id]['quantity'] += quantity
        
        self.save()
    def __iter__(self):
        """
        Iterate over the items in the cart
        and get the products from the database
        """
        product_ids = self.cart.keys()
        # get the product objects and add the o the cart
        products = Product.objects.filter(id__in=product_ids)

        cart = self.cart.copy()

        for product in products:
            cart[str(product.id)]['product'] = product
        
        for item in cart.values():
            item['price'] = Decimal(item['price'])
            item['total_price'] = item['price'] * item['quantity']
            yield item

    def get_total_price(self):
        """
        Calculate the total cost of the items in the cart
        """
        return sum(Decimal(item['price']) * item['quantity'] for item in self.cart.values())

orders.py

def order_create(request):
    cart = Cart(request)
    order = None
    address_form = AddressCheckoutForm()
    billing_address_id = request.session.get('billing_address_id', None)
    shipping_address_id = request.session.get('shipping_address_id', None)
    order, created = Order.objects.get_or_create(user=request.user, ordered=False)
    if shipping_address_id:
        shipping_address = Address.objects.get(id=shipping_address_id)
        order.shipping_address = shipping_address
        del request.session['shipping_address_id']
    if billing_address_id:
        billing_address = Address.objects.get(id=billing_address_id)
        order.billing_address = billing_address
        del request.session['billing_address_id']
    if billing_address_id or shipping_address_id:
        order.save()
    
    if request.method == 'POST':
        for item in cart:
            OrderItem.objects.create(
                order=order,
                product=item['product'],
                price=item['price'],
                quantity=item['quantity']
            )
        order.ordered = True
        order.save()
        cart.clear()
        return render(request, 'orders/order/created.html', {'order': order})
    return render(request, 'orders/order/create.html', {'cart': cart, 'address_form': address_form, 'object': order})     

create.html

<h1>Checkout</h1>
    {% if not object.shipping_address %}
        <h3>Shipping</h3>
        {% url "addresses:checkout_address_create" as checkout_address_create %}
        {% include 'address/form.html' with form=address_form next_url=request.build_absolute_uri action_url=checkout_address_create address_type='shipping' %}
    {% elif not object.billing_address %}
        <h3>Billing</h3>
        {% url "addresses:checkout_address_create" as checkout_address_create %}
        {% include 'address/form.html' with form=address_form next_url=request.build_absolute_uri action_url=checkout_address_create address_type='billing' %}
    {% else %}
        {% for item in cart %}
            {{ item.quantity }} X {{ item.product.name }}
            {{ item.total_price }}
        {% endfor %}
        <p>Total Price: {{ cart.get_total_price }}</p>
        <form action="" method="POST">
            {% csrf_token %}
            <p><input type="submit" value="Place Order"></p>
        </form>
    {% endif %}

Traceback

Internal Server Error: /order/create/
Traceback (most recent call last):
  File "/home/duke/Monday/truck-giggle/env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/duke/Monday/truck-giggle/env/lib/python3.8/site-packages/django/utils/deprecation.py", line 96, in __call__
    response = self.process_response(request, response)
  File "/home/duke/Monday/truck-giggle/env/lib/python3.8/site-packages/django/contrib/sessions/middleware.py", line 58, in process_response
    request.session.save()
  File "/home/duke/Monday/truck-giggle/env/lib/python3.8/site-packages/django/contrib/sessions/backends/db.py", line 83, in save
    obj = self.create_model_instance(data)
  File "/home/duke/Monday/truck-giggle/env/lib/python3.8/site-packages/django/contrib/sessions/backends/db.py", line 70, in create_model_instance
    session_data=self.encode(data),
  File "/home/duke/Monday/truck-giggle/env/lib/python3.8/site-packages/django/contrib/sessions/backends/base.py", line 105, in encode
    serialized = self.serializer().dumps(session_dict)
  File "/home/duke/Monday/truck-giggle/env/lib/python3.8/site-packages/django/core/signing.py", line 87, in dumps
    return json.dumps(obj, separators=(',', ':')).encode('latin-1')
  File "/usr/lib/python3.8/json/__init__.py", line 234, in dumps
    return cls(
  File "/usr/lib/python3.8/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.8/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python3.8/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Decimal is not JSON serializable
[29/Jul/2020 14:20:17] "GET /order/create/ HTTP/1.1" 500 102125

The error

错误

code block that is raising the error

在此处输入图像描述

removing the block

在此处输入图像描述

after removing the block and refreshing the page

在此处输入图像描述

adding the block again

在此处输入图像描述

after adding the block and refreshing the page

在此处输入图像描述

As you can see before removing the code block the error is there, after removing it and refreshing the page and adding the code block back to the templates and refreshing the page again seems to work fine.正如您在删除代码块之前看到的那样,错误就在那里,在删除它并刷新页面并将代码块添加回模板并再次刷新页面之后似乎工作正常。 Can you please help me out with this?你能帮我解决这个问题吗?

The problem here at this line这条线的问题

for product in products:
    cart[str(product.id)]['product'] = product 

product's instance has a decimal field, the price field, which is not JSON serializable. product 的实例有一个 decimal 字段,即 price 字段,它不是 JSON 可序列化的。 So to solve this error, you can add explicitly the product's fields, you want to use in the template, into the session data to loop over.因此,要解决此错误,您可以将要在模板中使用的产品字段显式添加到 session 数据中进行循环。 For instance:例如:

cart[str(product.id)]['product_name'] = product.name
cart[str(product.id)]['product_price'] = float(product.price) 

and for the price field, instead of converting it into Decimal, you can use float:对于价格字段,您可以使用浮点数而不是将其转换为十进制:

for item in cart.values():
    item['price'] = float(item['price']) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 TypeError: 十进制类型的 Object 不是 JSON 可序列化的 - TypeError: Object of type Decimal is not JSON serializable Flask TypeError:Decimal 类型的对象不是 JSON 可序列化的 - Flask TypeError: Object of type Decimal is not JSON serializable TypeError:“TopicSerializer”类型的对象不是 JSON 可序列化的 Django - TypeError: Object of type 'TopicSerializer' is not JSON serializable Django “十进制”类型的 Object 不是 JSON 可序列化的 - Object of type 'Decimal' is not JSON serializable 类型错误:Object 类型不是 JSON 可序列化 - TypeError: Object of type is not JSON serializable Django REST:TypeError:“语言”类型的对象不是 JSON 可序列化的 - Django REST: TypeError: Object of type 'Language' is not JSON serializable TypeError: Object of type Folder is not JSON serializable in Django Rest framework - TypeError: Object of type Folder is not JSON serializable in Django Rest framework TypeError:TypeError 类型的对象不是 JSON 可序列化的 Python - TypeError: Object of type TypeError is not JSON serializable Python TypeError:“ OperationalError”类型的对象不可JSON序列化 - TypeError: Object of type 'OperationalError' is not JSON serializable “ TypeError:字节类型的对象不可JSON序列化” - “TypeError: Object of type bytes is not JSON serializable”
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM