【问题标题】:How to save list of objects using bulk_update method in Django?如何在 Django 中使用 bulk_update 方法保存对象列表?
【发布时间】:2019-09-26 10:55:16
【问题描述】:

我有一个循环遍历对象并将它们添加到列表中

for note in notes:
             old_note = Note(
                        user_id=note['id']),
                        author=note['author'],         
                    )
                    existing_notes.append(old_note)
 Worklog.objects.bulk_update(
                existing_notes,
                [
                    'user_id',
                    'author',
                ],
                batch_size=1000)

但它没有像我希望的那样工作。当我在 django 中使用 celery 任务运行我的脚本时,它有点崩溃。请帮助大家,如果有能够表明我的错误。 我的最终目标是将我需要的所有对象添加到列表中并立即在数据库中更新它们,因为我有很多数据

【问题讨论】:

  • 这不是完整的代码,对吧?您的 existing_nodes 列表是在哪里创建的?您可以发布您的代码中实例化 existing_notes 的部分吗?
  • 是的,你是对的。现有节点只是我放置对象的空列表,然后尝试通过批量更新来更新所有节点。

标签: django performance orm


【解决方案1】:

如果您要创建新对象,则应使用bulk_create 而不是bulk_update

bulk_update 将尝试查找和更新现有对象,但是当您通过实例化对象的类来创建对象时,就像您对Note(...) 所做的那样,它还没有保存到数据库中。所以这就是你得到错误的原因。

另外,您使用的模型相互冲突。您创建了一个Notes 列表,但尝试通过Worklog 更新它们。 对它们都使用NoteWorklog

您更新后的代码应如下所示:

for note in notes:
             old_note = Note(
                        user_id=note['id']),
                        author=note['author'],         
                    )
                    existing_notes.append(old_note)

 Note.objects.bulk_create(
                existing_notes,
                batch_size=1000)

【讨论】:

  • 谢谢 Nico) 我使用批量创建方法成功,但不能使用更新方法。如何使用列表一次更新数据库中的大量对象?
  • 这取决于上下文。一般来说,确保您正在更新的对象存在于数据库中,确保您不更新它们的主键,并确保您将正确的字段传递给bulk_update 方法。我建议您查看 bulk_update 上的文档以获取示例:docs.djangoproject.com/en/2.2/ref/models/querysets/#bulk-update
  • 我检查了文档,检查了所有字段,但我的脚本没有更新数据库中的对象。我对 doc 中的一件事感到困惑,有人说“该方法不调用 post save 方法”,这是否意味着我无法使用 bulk_update 方法更新数据库中的对象???我将正确的数据传递给列表,并将其传递给 bulk_update 方法,但它不会更新数据库中的对象。
  • bulk_update 方法是否以类似的方式工作?如果我只是在您编辑的示例中将 bulk_create 更改为 bulk _update 会起作用吗?
【解决方案2】:

假设您有一个带有名称字段的模型对象 Book, 喜欢:

在模型中

class Book(models.Model):
    name = models.CharField(max_length=200, blank = True)

那么,如果您有创建书籍的名称列表:

book_list = [{"name":"A"},{"name":"B"},{"name":"C"}]

然后您要做的就是将此列表(字典列表)传递给 Book() 以首先创建 Book 对象列表。 然后最后一步是将这些对象保存到数据库使用

Book.objects.bulk_create(list of objects here)

看起来像:

objects = [] #list for Book objects

new_object = [] #list for new object to add to Book objects

for i in booklist:  #'booklist' is the list of bookname dictionaries
`new_object = Book(name = i['name']) #book objects with each name in` 


booklist
objects.append(new_object) #list of Book objects

#saving list of book objects created in the for loop
Book.objects.bulk_create(objects)

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 2016-03-04
    • 1970-01-01
    • 2015-08-03
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多