Django:使用QuerSets最小化数据库命中

时间:2018-07-11 18:44:44

标签: django django-queryset

我有此自定义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)

1 个答案:

答案 0 :(得分:2)

您可以先执行count = queryset.count(),然后将其用作if条件,然后在字符串中插入。因此,您将摆脱exists查询。另外,要查找日期范围,您可以将aggregateMinMax一起使用,因此您在此处保存了另一个查询。但是对于我来说,这并不是一个真正的问题。请记住,除非确定性能存在问题,否则不要过早进行优化。