Ключ сессии Django не найден с помощью str(instance.id)

Это мой сценарий У меня есть сигнал на приложениях корзины, который поднимается, когда администратор удаляет продукт в 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', но код django не может найти его, даже если я преобразую ключ в str. Пожалуйста, помогите мне в этом вопросе.

Если я правильно понял, то это данные в 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 объекты массово с помощью .bulk_update(…) [Django-doc].

Но сигналы часто являются антипаттерном [django-antipatterns]. Действительно, сигналы, например, не выполняются, если вы выполняете операции в массовом порядке. Как правило, лучше искать логику, не полагающуюся на сигналы. Раскрытие информации: я являюсь автором этой страницы.

Вернуться на верх