Python 在Django中有条件地使用动态值批量更新查询的最佳方法
我只是想知道是否可以在django中批量保存查询 例如,通常我必须遍历每个对象Python 在Django中有条件地使用动态值批量更新查询的最佳方法,python,django,save,django-queryset,Python,Django,Save,Django Queryset,我只是想知道是否可以在django中批量保存查询 例如,通常我必须遍历每个对象 for obj in queryset: if condition: obj.field = True obj.save() 编辑: 我知道上述情况可以通过update方法处理。但是,上面的示例正在使用相同的值保存所有字段。如果有不同的情况呢 for obj in queryset: if condition: obj.field = True
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()
以上可能不是我目前能想到的最好的例子,但我会说类似的话
有没有更快的方法
提前感谢您提供的任何建议Querysets有一种方法可以做到这一点。但是,还有一些警告,比如没有调用modelsave
方法。如果您为您的模型重写并实现自己的save
方法,请记住这一点
从django文档:
例如,要关闭2010年发布的所有博客条目的评论,可以执行以下操作:
因此,换句话说queryset.update(field='value')
更新:关于根据条件动态执行此操作
因为update
在SQL级别执行(由DB执行),所以您希望在查询中使用您的条件,这几乎总是以某种方式实现的。您可以执行多个查询以获得效果
def my_bulk_update():
MyModel.objects.filter(conditional_field=True).update(field=True)
MyModel.objects.filter(conditional_field=False).update(field=False)
有许多聪明的方法可以通过查询来实现这一点(包括,等等)。。。你可能会惊讶于你能在查询中塞进多少逻辑。请务必在上查看文档。当然,如果ORM在生成查询时没有完全做到这一点,您也可以编写自己的SQL来有效地完成同样的事情
如果逻辑非常复杂,无法使用SQL完成,则可以大致按照您已经编写的方式执行,但如果有大量记录,则可能需要使用SQL来提高性能。如果需要为数据库中的每个记录设置不同的值,则可以手动提交
from django.db import transaction
...
transaction.set_autocommit(False)
for obj in queryset:
if condition:
obj.field = random_value
obj.save()
else:
obj.field = another_random_value
obj.save()
transaction.commit()
transaction.set_autocommit(True)
可能是我编辑的标题的副本,希望这能让问题变得更明显。根据提问者提供的补充说明,这可能不是重复的。对不起>@Dora啊,我想我现在明白你的意思了。简而言之,您可能希望在查询中使用if条件逻辑。有很多聪明的方法可以做到这一点。我会马上更新我的答案,一旦我更新了,请告诉我您是否需要更多的澄清。@Dora我更新了我的答案。如果你脑子里有一些特定的逻辑,你想知道如何把你脑子里的一些特定的基本逻辑运用到一个查询中,请告诉我,我会看看我的回答是否能适应。如果逻辑足够复杂,可以研究文档以进行查询,或者在无法理解的情况下专门提出另一个问题。很有可能可以通过查询来完成。感谢您在标题方面的帮助,我非常不擅长给出标题和查看您的conditional\u字段
,我确实了解得更多,尽管仍然有一个小问题卡在我的脑海中,我无法把它说出来。我遇到了一些问题,但我会给出一个正确的答案,因为这两个例子就是我现在脑子里想的。非常感谢您花时间解释。
from django.db import transaction
...
transaction.set_autocommit(False)
for obj in queryset:
if condition:
obj.field = random_value
obj.save()
else:
obj.field = another_random_value
obj.save()
transaction.commit()
transaction.set_autocommit(True)