我只是想知道是否可以在 django 中批量保存查询。
例如,通常我必须循环遍历每个对象
for obj in queryset:
if condition:
obj.field = True
obj.save()
编辑:
我知道上面的情况可以用update
方法来处理。但是,上面的示例使用相同的值
保存所有字段
。如果条件不同怎么办?
for obj in queryset:
if condition:
obj.field = True
obj.save()
else:
obj.field = False
obj.save()
上面的内容可能不是我目前能想到的最好的示例,但我会说类似的内容。
有没有更快的方法来做到这一点?
预先感谢您的任何建议
最佳答案
查询集有 update正是这样做的方法。但是,有一些警告,例如未调用模型 save
方法。如果您为模型重写并实现自己的 save
方法,请记住这一点。
来自 django 文档:
For example, to turn comments off for all blog entries published in 2010, you could do this:
>>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False)
所以,换句话说queryset.update(field='value')
更新:关于根据条件动态执行此操作...
因为 update
在 SQL 级别执行(由数据库执行),所以您可能希望将您的条件应用到查询中,这几乎总是可以以一种或另一种方式实现。您可以进行多次查询以获得效果。
def my_bulk_update():
MyModel.objects.filter(conditional_field=True).update(field=True)
MyModel.objects.filter(conditional_field=False).update(field=False)
您可以通过许多巧妙的方法进行查询来实现此目的,(包括 annotating, aggregating 、 expressions 等)...您可能会惊讶于可以在查询中填充多少逻辑。请务必查看 making queries 上的文档。当然,如果 ORM 无法通过生成查询来完全消除它,您也可以随时编写自己的 SQL 来有效地完成相同的操作。
如果逻辑确实很复杂并且无法用 SQL 完成,您可以大致按照您已经编写的方式进行操作,但可能需要使用 transactions如果您有大量记录,则可以提高性能。
关于python - 在 Django 中有条件地使用动态值批量更新查询的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48292070/