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")
关键改动说明
- 定位嵌套购物车数据:通过
data.get('session_key', {})取出存储购物车的子字典,确保会话中无购物车数据时也不会报错。 - 修正ID匹配逻辑:在购物车子字典内判断产品ID是否存在,而非会话顶级字典。
- 正确更新会话:修改后的购物车数据重新赋值回对应键,并用
Session.encode(data)正确编码后保存(原代码直接赋值session['cart'] = data的方式不符合Django会话存储规范)。
内容的提问来源于stack exchange,提问作者Jose Perez
相关产品推荐
相关产品推荐

