当前位置: 首页 > 知识库问答 >
问题:

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

王念
2023-03-14

我只是想知道是否有可能在django中批量保存查询。

例如,通常我必须遍历每个对象

for obj in queryset:
    if condition:
        obj.field = True
        obj.save()

编辑:

我知道上面的情况可以用< code>update方法来处理。但是,上面的示例使用相同的< code >值保存所有< code >字段。如果有不同的情况呢?

for obj in queryset:
    if condition:
        obj.field = True
        obj.save()
    else:
        obj.field = False
        obj.save()

以上可能不是我目前能想到的最好的样本,但我会说一些类似的东西。

有没有更快的方法来做到这一点?

提前感谢您的任何建议

共有2个答案

阎坚成
2023-03-14

如果需要为数据库中的每条记录设置不同的值,可以手动提交。

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)
魏安然
2023-03-14

Querysets有一个update方法可以做到这一点。但是,有一些注意事项,比如没有调用model save方法。如果您为您的模型重写并实现您自己的< code>save方法,请记住这一点。

来自django文档:

例如,要关闭2010年发布的所有博客条目的评论,您可以这样做:

>>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False)

因此,换句话说< code > query set . update(field = ' value ')

更新:关于基于条件动态执行此操作。。。

由于更新在 SQL 级别执行(由数据库执行),因此您希望将条件处理到查询中,这几乎总是以这样或那样的方式实现。您可以执行多个查询来获得效果。

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 完成,则可以大致按照已经编写的内容进行操作,但如果有大量的记录,则可能需要使用事务来提高性能。

 类似资料:
  • 问题内容: 我想用Django更新表格-原始SQL中的内容如下: 我的第一个结果是这样的-但这很讨厌,不是吗? 有没有更优雅的方式? 问题答案: UPD Django 2.2版本现在具有bulk_update。 请参阅以下django文档部分 一次更新多个对象 简而言之,你应该可以使用: 你还可以使用F对象来执行诸如增加行数之类的操作: 请参阅文档:https : //docs.djangopro

  • 大家好,我试着做一个方法来应用条件一个SelectQuery,但我不知道如何通过名称获得字段或通过名称获得表,代码示例... 但字段总是空的... 我怎么解决这个。

  • 我想在一条语句中更新PostgreSQL和Go中的多行。有没有办法做如下事情? 还有有没有一个例子,如果用go语言执行?

  • 问题内容: 我已将此代码用于提供+1分,但无法正常工作。 $ points变量现在是用户的点数。.我希望它加上一个点数。.例如,如果他有5个点数,它应该是5 + 1 =6。 但是没有,它只是改变了到1 我做错了什么?谢谢 问题答案: 您也可以这样做:

  • 我有一个laravel命令,它搜索SQL Server数据库中的数据,并在MySQL数据库中插入每一行(如果已经存在,则更新)。 这是当前工作的代码: 首先,从SQL服务器搜索行: 然后插入和/或更新: 标签表定义如下: 对于每个块,填充数组和(给定每个块的行数,大约总共50秒)需要1/2秒,插入数据需要半秒 问题: 是否有更快的方法来填充数组? 由于客户端的限制,我们不能修改MySQL数据库中的

  • 问题内容: 我有下面的代码,我在布尔查询中做多个必须的。在这里,我将在字段“地址”中传递必填项查询。现在,该IP地址将以其他api的列表的形式出现在我的面前,我必须将列表中的所有IP作为必填项查询传递给我。在这里,我没有办法创建QueryBuilder时如何动态传递地址值。 请提出建议。 问题答案: 您可以使用条件查询为单个字段传递多个值。创建一个字符串数组或集合。并将其传递给条款查询。 希望能帮