我有此自定义admin命令,可删除一些旧记录。 QuerySets很懒,所以我想知道是否有一种方法可以优化此代码,因为目前--dry-run
模式下有四个命中数据库:
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('--dry-run', action='store_true')
def handle(self, *args, **options):
threshold = timezone.now() - timezone.timedelta(5)
try:
if options['dry_run']:
queryset = Mointor.objects.filter(created__lt=threshold)
if queryset.exists():
msg = f'{queryset.count()} record(s) will be deleted, from {queryset.first().created} to {queryset.last().created}'
else:
msg = 'No records to delete'
else:
Monitor.objects.filter(created__lt=threshold).delete()
msg = 'OK'
except Exception as e:
raise CommandError(e)
self.stdout.write(msg)
答案 0 :(得分:2)
您可以先执行count = queryset.count()
,然后将其用作if
条件,然后在字符串中插入。因此,您将摆脱exists
查询。另外,要查找日期范围,您可以将aggregate
与Min
和Max
一起使用,因此您在此处保存了另一个查询。但是对于我来说,这并不是一个真正的问题。请记住,除非确定性能存在问题,否则不要过早进行优化。