Django中使用get_or_create()进行批量插入的高效方法 (SQL, Python, Django)

25 投票
5 回答
25798 浏览
提问于 2025-04-15 19:12

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

for item in item_list:
    e, new = Entry.objects.get_or_create(
        field1 = item.field1,
        field2 = item.field2,
    )

5 个回答

1

从1.4版本开始,你可以使用bulk_create这个功能。

可以查看官方文档了解更多信息。

*不过要注意一些注意事项,最重要的一点是,模型的save()方法不会被调用,因此pre_save和post_save的信号也不会被发送。*

4

这要看你想要达到什么目的。如果你想加载数据,可以使用 manage.py 里的 loaddata 功能,它可以以合适的格式(比如 JSON、XML、YAML 等)来加载数据。

你也可以看看 这个讨论

11

使用 get_or_create(或者 create)来进行大量插入数据是不太行的,而且没有简单的方法可以做到这一点。

如果你的表格结构比较简单,直接用原始 SQL 来创建数据行也不会太麻烦,其实也不难;可以像这样做:

INSERT INTO site_entry (field1, field2)
(
         SELECT i.field1, i.field2
         FROM (VALUES %s) AS i(field1, field2)
         LEFT JOIN site_entry as existing
                 ON (existing.field1 = i.field1 AND existing.field2 = i.field2)
         WHERE existing.id IS NULL
)

这里的 %s 是一个字符串,比如 ("field1, field2"), ("field3, field4"), ("field5, field6"),你需要自己创建并确保格式正确。

撰写回答