Django:有没有办法有效地批量 get_or_create()

Posted

技术标签:

【中文标题】Django:有没有办法有效地批量 get_or_create()【英文标题】:Django: Is there a way to effienctly bulk get_or_create() 【发布时间】:2021-09-15 23:30:08 【问题描述】:

我需要导入一个包含论文和作者的数据库(以 JSON 格式提供)。 数据库非常大(1.94 亿条目),所以我不得不使用 django 的 bulk_create() 方法。

第一次加载作者我使用以下脚本:

def load_authors(paper_json_entries: List[Dict[str, any]]):
    authors: List[Author] = []
    for paper_json in paper_json_entries:
        for author_json in paper_json['authors']:
            # len != 0 is needed as a few authors dont have a id
            if len(author_json['ids']) and not Author.objects.filter(author_id=author_json['ids'][0]).exists():
                authors.append(Author(author_id=author_json['ids'][0], name=author_json['name']))
    Author.objects.bulk_create(set(authors))

但是,这太慢了。 瓶颈是这个查询:

and not Author.objects.filter(author_id=author_json['ids'][0]).exists():

不幸的是,我不得不做这个查询,因为一个作者当然可以写多篇论文,否则会出现密钥冲突。

有没有办法使用 bulk_create 有效地实现像普通的 get_or_create() 这样的东西?

【问题讨论】:

"ignore_conflicts=True" 会在 db 方面做另一件事,对于 200M 条目,您应该考虑使用某种生成器功能而不是 List。例如“open()”给你一个文件对象,每次产生一行。 【参考方案1】:

为避免使用现有的唯一键创建条目,您可以启用ignore_conflicts 参数:

def load_authors(paper_json_entries: List[Dict[str, any]]):
    Author.objects.bulk_create(
        (
            Author(author_id=author_json['ids'][0], name=author_json['name'])
            for paper_json in paper_json_entries
            for author_json in paper_json['authors']
        ),
        ignore_conflicts=True
    )

【讨论】:

谢谢!这就是我要找的!

以上是关于Django:有没有办法有效地批量 get_or_create()的主要内容,如果未能解决你的问题,请参考以下文章

django 后台管理界面 administration 中有办法批量导入数据吗

有没有办法检查字符串是不是是 django 查询集的有效过滤器?

如何在 Django 中执行批量插入?

Django - 高效地批量创建继承模型

核心数据:有没有办法使用隐含关系而不是真实关系来有效地查询模型?

有没有办法用两个日期之间的每小时日期时间有效地填充 python 中的 pandas df 列?