【问题标题】:Django 1.4 - bulk_create with a listDjango 1.4 - 带有列表的 bulk_create
【发布时间】:2012-05-28 07:32:19
【问题描述】:

我有一个列表,我想在数据库中批量创建条目。

如何在不循环列表的情况下做到这一点,我认为这会消除 bulk_create 的意义。

例如:

而不是...

for x in list:
    bulk_create...

我怎么可能……

bulk_create for the entire list at once in an efficient manner

列表包含:

list = ['abc', 'def', 'ghi']

它只是一个 id 列表,而不是可以直接输入 bulk_create 的形式(不使用输入字段格式化)。但是,我认为可以在将列表传递给 bulk_create 之前对其进行修改。

【问题讨论】:

  • 我不明白。您想创建一个具有显式 id 的对象列表,而不是让它们自动添加?这就是你所追求的吗?
  • @jdi 我将更改示例并尝试给出更具体的示例。

标签: python django


【解决方案1】:

试试这个,bulk_create 的目的是只点击一次数据库,不管你创建多少。这就是为什么我们认为它是高效的。

class Entry(models.Model):
    name = models.CharField(max_length = 10)

a = ['test1', 'test2', 'test3', 'test4']

Entry.objects.bulk_create([Entry(name=x) for x in a])

---编辑---

假设你在你的 models.py 中有一个这样的模型:

class Entry(models.Model):
    id = models.CharField(max_length = 10)

你有一个这样的列表(直接从你的问题中复制):

list = ['abc', 'def', 'ghi']

只需一行:

Entry.objects.bulk_create([Entry(id=x) for x in list])

【讨论】:

  • 这仍然需要我手动将参数放入列表 a 中。你能想出什么方法来跳过这个吗?
  • @thong 我猜你忽略了我的部分答案。这里列出一个只是为了演示目的,不需要“手动输入”。见编辑。
  • 谢谢!我对编程比较陌生,所以直到编辑我才明白。
【解决方案2】:

bulk_create 在一次调用中将对象列表作为单个 arg。您在示例中所做的与循环和执行 create()

相同

参考:https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create

aList = [
    Entry(headline="Django 1.0 Released"),
    Entry(headline="Django 1.1 Announced"),
    Entry(headline="Breaking: Django is awesome")
]
Entry.objects.bulk_create(aList)

aList 指的是您已经实例化并需要通过一个查询批量创建的对象列表。例如,如果您还没有未保存的实例列表,并且您有一个值列表,那么您可以使用以下内容创建列表:

values = ['abc', 'def', 'ghi']
# a list of unsaved Entry model instances
aList = [Entry(headline=val) for val in values]

或者,也许您有一个映射到模型的原始字典值列表:

values = [{headline="abc"}, {headline="def"}, {headline="ghi"}]
aList = [Entry(**vals) for vals in values]

【讨论】:

  • 这仍然需要我手动将参数放入“aList”中。你能想出什么方法来跳过这个吗?我已经有一个清单。我想我可以将其转换为字符串列表,每个字符串都与您在 aList 中列出的内容完全相同?
  • @thong:我认为您可能没有抓住重点。如果您已经有一个对象列表,只需将该列表传递给bulk_create 一次。这个例子展示了一个列表将包含什么供你传递它。如果您仍然对这部分感到困惑,您能否更新您的问题以显示您已经拥有的列表中的内容?
  • 列表不是您的 aList 格式。我将尝试编辑更改列表以查看是否有效。
  • @thong:我刚刚更新了值列表以匹配您的示例。这能解释清楚吗?
  • 是的!谢谢。我很抱歉,因为我这个不太具体的例子一开始一定令人困惑。
【解决方案3】:
>>> Entry.objects.bulk_create([
...     Entry(headline="Django 1.0 Released"),
...     Entry(headline="Django 1.1 Announced"),
...     Entry(headline="Breaking: Django is awesome")
... ])

您正在向 ORM 传递一个列表中的实例化对象列表。使用它,并假设 orig_list 是一个字典列表,

>>> my_objects = [MyObject(a=x['a'], b=x['b']) for x in orig_list]
>>> MyObject.objects.bulk_create(my_objects)

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 2012-07-13
    • 2018-03-12
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2015-11-17
    相关资源
    最近更新 更多