在删除同一QuerySet中的对象时迭代Django QuerySet

use*_*866 9 python django loops django-queryset

我想知道在删除Queryset中的对象时迭代Django QuerySet的最佳方法是什么?例如,假设您在特定时间有一个包含条目的日志表,并且您希望将它们存档,以便每5分钟输入不超过1个条目.我知道这可能是错的,但这是我想要的:

toarchive = Log.objects.all().order_by("-date")
start = toarchive[0].date
interval = start - datetime.timedelta(minutes=5)
for entry in toarchive[1:]:        
    if entry.date > interval:
        entry.delete()
    else:
        interval = entry.date - datetime.timedelta(minutes=5)
Run Code Online (Sandbox Code Playgroud)

use*_*866 5

所以我想如果其他人好奇的话,我已经通过提问回答了我自己的问题。我认为在迭代对象时删除对象时会出现问题,但事实并非如此。问题中的代码片段是正确的方法。

  • 执行过滤操作后,如何从查询集中删除元素而不是删除对象? (2认同)

Wil*_*ill 1

查询集有一个delete方法可以删除该查询集的所有结果。对于你给出的例子

toarchive.filter(date__gt=interval).delete()
Run Code Online (Sandbox Code Playgroud)

将工作。但是,如果您正在进行的测试无法在过滤器中完成,那么您描述的方法可能是最好的。