运行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的运行环境不存在导入规则差异,问题纯粹出在导入的包不对。
修正步骤:
- 替换导入语句:把
from datetime import timezone, timedelta改成:
from datetime import timedelta from django.utils import timezone
- 代码里的
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
相关产品推荐
相关产品推荐

