Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中有条件地使用动态值批量更新查询的最佳方法_Python_Django_Save_Django Queryset - Fatal编程技术网

Python 在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

我只是想知道是否可以在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()
以上可能不是我目前能想到的最好的例子,但我会说类似的话

有没有更快的方法

提前感谢您提供的任何建议

Querysets有一种方法可以做到这一点。但是,还有一些警告,比如没有调用model
save
方法。如果您为您的模型重写并实现自己的
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)