我有一个Apscheduler作业,它更新订阅模型中的active字段并将其设置为False。我创建了一个post_保存信号,该信号应该在订阅模型更新时触发,但它不起作用。以下是我的代码。
--job.py--
from django.conf import settings
from subscription.models import AccountSubscription
from django.utils import timezone
def schedule_api():
try:
data = {'is_active':False}
AccountSubscription.objects.filter(expiry_date__lte=timezone.now(), is_active=True).update(**data)
except Exception:
pass
--信号。py--
@receiver(post_save, sender=AccountSubscription)
def post_save_user_subscription_expired(sender, instance, created, **kwargs):
"""Notifies users of subscription expiration."""
try:
if not created:
if not instance.is_active:
print("Notified users")
except Exception as ex:
print(ex)
# context = {
# 'status': 'error',
# 'message': 'A subscription expiration notification error has occurred.'
# }
# raise exceptions.ParseError(context)
拜托,我是不是做错了什么?
1条答案
按热度按时间kqlmhetl1#
update方法不调用保存方法,也不触发信号。原因Django直接进行SQL查询
记录如下:https://docs.djangoproject.com/en/4.1/ref/models/querysets/#update
解决方案是创建一个循环来直接更新每个示例,或者将通知业务逻辑移到一个函数中,并在更新查询之后调用它。