【问题标题】:Django: minimize database hits with QuerSetsDjango:使用 QuerSets 最小化数据库命中
【发布时间】:2018-07-11 18:44:44
【问题描述】:

我有这个自定义管理命令来删除一些旧记录。 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)

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

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

    【讨论】:

    • 还有一件事。您只能聚合然后检查最小值或最大值是否为无,所以最后一个查询)
    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多