创建Django查询集快照的最有效方法?

时间:2019-04-03 22:19:54

标签: django django-queryset

我是Django的新手,我需要清理所有现有的满足某些条件的对象,这些条件是由进口商先前创建的,在进口商重新运行之前。

我正在尝试找出最有效的方法。目前,在导入新对象并使用布尔值to_be_deleted=True更新它们之前,我正在获取现有对象:

Thing.objects.filter(source=importer).update(to_be_deleted=True)
import_new_things(source=importer)
Thing.objects.filter(to_be_deleted=True).delete()

但是我真的需要在整个查询集上运行更新吗?有没有一种方法可以将查询集的快照保存到变量中,然后在导入程序完成后将其删除?

1 个答案:

答案 0 :(得分:2)

要保存查询集的“快照”,您只需获取ID列表即可。

# Get all the objects IDs
current_object_ids = list(Thing.objects.filter(source=importer).values_list('id', flat=True))

然后您可以调用函数,如果成功,则可以删除其他对象。

try:
    import_new_things(source=importer)
except: 
    # do something
else:
    # Run your delete
    Thing.objects.filter(id__in=current_object_ids).delete()