使用 str(instance.id) 找不到 Django 会话密钥

问题描述 投票:0回答:1

这是我的场景,我在购物车应用程序上有一个信号,当管理员在 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 代码也无法找到它。请有人帮助我。

django session key
1个回答
0
投票

鉴于我理解正确,这是密钥

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-反模式]。事实上,如果您进行批量操作,信号就不会运行。通常最好寻找不依赖信号的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.