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

运行Django自定义命令报错:'datetime.timezone'无'now'属性

问题解决:Django自定义命令中'datetime.timezone' has no attribute 'now'

错误根源是你导入的**Python标准库datetime.timezone**没有now()方法,而views里能正常运行,是因为你在views中实际使用的是Django提供的时区工具django.utils.timezone(大概率是导入时的疏忽,比如views里用了from django.utils import timezone但没留意到)。

自定义命令和views的运行环境不存在导入规则差异,问题纯粹出在导入的包不对。

修正步骤:

  1. 替换导入语句:把from datetime import timezone, timedelta改成:
from datetime import timedelta
from django.utils import timezone
  1. 代码里的timezone.now()调用无需修改,Django的timezone.now()会返回带时区的当前时间,正好匹配Django模型中date_joined字段的时区属性。

修正后的完整代码:

from django.core.management.base import BaseCommand
from datetime import timedelta
from django.utils import timezone

from gridsquid.models import User, Tile

DEFAULT_TILE_IMG_NAME = "defaultsquid.svg"
MAX_GUEST_ACCOUNT_DAYS = 30

class Command(BaseCommand):
    def handle(self, *args, **options):
        """
        Deletes all guest user accounts and their media if older than MAX_GUEST_ACCOUNT_DAYS
        """
        # 计算过期时间阈值,避免重复计算
        cutoff_time = timezone.now() - timedelta(days=MAX_GUEST_ACCOUNT_DAYS)
        expired_guests_count = User.objects.filter(guest=True, date_joined__lt=cutoff_time).count()
        expired_guests = User.objects.filter(guest=True, date_joined__lt=cutoff_time)
        
        for guest in expired_guests:
            tiles = Tile.objects.select_related("user").filter(user=guest)
            for tile in tiles:
                # 删除非默认图片
                if DEFAULT_TILE_IMG_NAME not in tile.image.url:
                    tile.image.delete()
                # 删除音频文件(如果存在)
                if tile.audio is not None:
                    tile.audio.delete()
            # 删除访客账号
            guest.delete()

额外优化:把重复的时间计算提取为cutoff_time变量,去掉了冗余的.all()调用(filter()返回的QuerySet本身可迭代)。

内容的提问来源于stack exchange,提问作者ragmats

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:20:53