You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)))

错误分析

  1. 直接用User.date_joined + timedelta(seconds=1800)逻辑错误:User是模型类,date_joined是字段对象,无法直接与Python的timedelta相加,需用Django的数据库层面运算方式实现。
  2. ORM查询规则不允许将Now()放在条件左侧(如Now()__gt=expiry),Django要求字段在条件左侧,查询值在右侧。
  3. 代码末尾的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:05:29