这是我的场景,我在购物车应用程序上有一个信号,当管理员在 django 中删除产品时会引发该信号,但在会话中搜索产品密钥不起作用,下面是我正在使用的代码
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):
# Get all sessions
for session in Session.objects.all():
data = session.get_decoded()
print(data)
if str(instance.id) in data:
print(f"Instance ID {instance.id} found in cart")
print(instance.id)
del data[str(instance.id)]
session['cart'] = data
session.save()
else:
print(f"Instance ID {instance.id} not found in cart")
当我得到结果时,在终端上它看起来像这样 {'session_key': {'47': 1}} 在购物车中找不到实例 ID 47
正如你所看到的,INSTANCE.ID 位于购物车“47”中,但即使我将密钥转换为 str,django 代码也无法找到它。请有人帮助我。
鉴于我理解正确,这是密钥
cart
中的数据,所以:
from django.contrib.sessions.models import Session
from django.db.models.signals import post_delete
from django.dispatch import receiver
from store.models import Product
@receiver(post_delete, sender=Product)
def update_cart_on_product_delete(sender, instance, **kwargs):
key = str(instance.id)
missing = object()
updated_sessions = []
for session in Session.objects.all():
data = session.get_decoded()['cart'] # 🖘 cart lookup
if data.pop(key, missing) is not missing:
session['cart'] = data
updated_sessions.append(session)
Session.objects.bulk_update(updated_sessions, fields=('session_data',))
我们还使用
Session
[Django-doc]. 批量更新这些
.bulk_update(…)
对象。
但是信号通常是反模式 [django-反模式]。事实上,如果您进行批量操作,信号就不会运行。通常最好寻找不依赖信号的逻辑。