python - 在 Django 中有条件地使用动态值批量更新查询的最佳方法

标签 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
        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, aggregatingexpressions 等)...您可能会惊讶于可以在查询中填充多少逻辑。请务必查看 making queries 上的文档。当然,如果 ORM 无法通过生成查询来完全消除它,您也可以随时编写自己的 SQL 来有效地完成相同的操作。

如果逻辑确实很复杂并且无法用 SQL 完成,您可以大致按照您已经编写的方式进行操作,但可能需要使用 transactions如果您有大量记录,则可以提高性能。

关于python - 在 Django 中有条件地使用动态值批量更新查询的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48292070/

相关文章:

python - 如何在Python中使用请求库将 key 发送到网页?

django - 多对多字段作为表单下拉菜单

java - 在文本文件中写入文本并使用保存对话框保存它

ios - Swift Game Center 保存高分功能不起作用

java - 删除内部保存文件 - Android

python - 使用openCV和python进行数字识别

python - 更多问题 'simple' 杂货 list

python - 使用python替换url中的端口

Django-redis-cache 无法从 Redis 获取数据

javascript - 使用 Django + Ajax 添加“赞”按钮