You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django删除产品时无法在Session中匹配产品ID问题

问题解决:Django删除产品后无法更新会话购物车

问题原因

从终端输出的会话数据 {'session_key': {'47': 1}} 可以看出,产品ID并非直接存储在会话的顶级字典中,而是嵌套在 session_key 对应的子字典里。原代码直接检查 str(instance.id) in data,只会匹配会话字典的顶级键,自然无法找到嵌套的产品ID。

修正后的代码

from django.db.models.signals import post_delete
from django.dispatch import receiver
from store.models import Product
from django.contrib.sessions.models import Session

@receiver(post_delete, sender=Product)
def update_cart_on_product_delete(sender, instance, **kwargs):
    product_id_str = str(instance.id)
    # 遍历所有会话
    for session in Session.objects.all():
        data = session.get_decoded()
        # 获取购物车数据(根据实际键名调整,这里是'session_key')
        cart_data = data.get('session_key', {})
        
        if product_id_str in cart_data:
            print(f"Instance ID {instance.id} found in cart")         
            # 从购物车中删除该产品
            del cart_data[product_id_str]
            # 如果购物车为空,移除对应的键避免空字典残留
            if not cart_data:
                del data['session_key']
            else:
                data['session_key'] = cart_data
            # 正确编码并保存会话数据
            session.session_data = Session.encode(data)
            session.save()
        else:
            print(f"Instance ID {instance.id} not found in cart") 

关键改动说明

  1. 定位嵌套购物车数据:通过 data.get('session_key', {}) 取出存储购物车的子字典,确保会话中无购物车数据时也不会报错。
  2. 修正ID匹配逻辑:在购物车子字典内判断产品ID是否存在,而非会话顶级字典。
  3. 正确更新会话:修改后的购物车数据重新赋值回对应键,并用 Session.encode(data) 正确编码后保存(原代码直接赋值 session['cart'] = data 的方式不符合Django会话存储规范)。

内容的提问来源于stack exchange,提问作者Jose Perez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:57:04