Ключ сессии 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]. Действительно, сигналы, например, не выполняются, если вы выполняете операции в массовом порядке. Как правило, лучше искать логику, не полагающуюся на сигналы. Раскрытие информации: я являюсь автором этой страницы.