2013-05-09 463 views
7

我想知道什么是删除Queryset中的对象时迭代Django QuerySet的最佳方法?例如,假设您在特定时间有一个包含条目的日志表,并且您想对其进行存档,以便每5分钟不超过1个条目。我知道这可能是错的,但是这是种什么我打算的:在同一个QuerySet中删除对象时迭代Django QuerySet

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) 
+3

这是有效的,你可以通过这种方式删除对象。 – Rohan 2013-05-09 17:08:18

+0

当在queryset上循环时使用delete(),当我转到模型的管理页面时保留一个空的记录。看来这个对象并没有完全删除。怎么了? – 2013-09-26 19:43:32

回答

0

查询集有一个delete方法,将删除该查询集的所有结果。例如,你给

toarchive.filter(date__gt=interval).delete() 

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

+0

感谢您的回复!我知道这种方法也是可能的。但是在这种情况下,我认为这不会起作用,因为删除条件是QuerySet中的条目之间的相对关系。我想我更想要更一般地了解的是,如果我从QuerySet中删除对象,并在遍历它时遇到问题。 – user1630866 2013-05-09 17:26:18

+0

你是对的,我没有注意那里的'else'子句。我没有测试过它,但删除QuerySet中的对象应该是安全的,因为'delete'只发出SQL删除查询,它不会影响内存中的模型对象。 – Will 2013-05-09 17:32:47

+0

会破坏数据库条目吗?或者只是从查询集中删除它? – jeff 2015-05-05 17:15:55

3

所以我想我已经回答了我自己的问题,如果其他人都好奇的话。我认为在迭代它们时删除对象时会出现问题,但是没有。问题中的代码片段是正确的方式。

+1

如何从查询集中删除元素,而不是在执行过滤操作后删除对象? – 2015-10-06 09:47:50