Django中基于令牌过期删除未激活用户的代码语法错误问题
Django 删除过期未激活用户的语法错误修复
问题描述
需要实现删除激活令牌过期(30分钟)且未激活的用户,编写的代码出现语法错误,调整Now()与expiry位置后语义不符合需求,请求修复语法问题并保证逻辑正确。
原代码
from django.db.models.functions import Now def delete_unactivated_users(): User = get_user_model() expiry = User.date_joined + timedelta(seconds=1800) unactivated_users = User.objects.filter(Q(Now()__gt=expiry) & (Q(is_active = False))) for user in unactivated_users: user.delete() print('<<<User Deleted>>>') user.save
尝试过的写法(语义不符)
unactivated_users = User.objects.filter(Q(expiry__lt=Now()) & (Q(is_active=False)))
错误分析
- 直接用
User.date_joined + timedelta(seconds=1800)逻辑错误:User是模型类,date_joined是字段对象,无法直接与Python的timedelta相加,需用Django的数据库层面运算方式实现。 - ORM查询规则不允许将
Now()放在条件左侧(如Now()__gt=expiry),Django要求字段在条件左侧,查询值在右侧。 - 代码末尾的
user.save无意义且语法错误,用户已执行删除操作,无需再保存。
修复后的代码
from datetime import timedelta from django.db.models import Q from django.db.models.functions import Now from django.contrib.auth import get_user_model def delete_unactivated_users(): User = get_user_model() # 筛选条件:未激活,且注册时间早于30分钟前(即已过期) unactivated_users = User.objects.filter( Q(is_active=False) & Q(date_joined__lt=Now() - timedelta(minutes=30)) ) for user in unactivated_users: user.delete() print('<<<User Deleted>>>')
代码说明
- 通过
Now() - timedelta(minutes=30)计算出30分钟前的时间节点,与用户的date_joined字段对比,精准筛选出注册超过30分钟的用户。 - 结合
is_active=False条件,锁定需要删除的未激活过期用户。 - 移除了无意义的
user.save操作,删除用户后无需执行保存动作。
内容的提问来源于stack exchange,提问作者Abdul Giwa
相关产品推荐
相关产品推荐

