Django数据库访问优化:高效创建多对多关系(在现有对象之间)

Django数据库访问优化:高效创建多对多关系(在现有对象之间),django,postgresql,optimization,many-to-many,manytomanyfield,Django,Postgresql,Optimization,Many To Many,Manytomanyfield,我正在使用Django 2.2和PostgreSQL数据库 我有两个模型:Gene和Annotation,需要同时创建和链接(多对多)数千个基因和注释 类基因(models.Model): 标识符=models.CharField(最大长度=50,主键=True) 注释=模型.ManyToManyField(注释) 类注释(models.Model): name=models.CharField(最大长度=120,唯一性=True,主键=True) 我已经找到了一种非常有效地创建对象的方法:

我正在使用Django 2.2和PostgreSQL数据库

我有两个模型:
Gene
Annotation
,需要同时创建和链接(多对多)数千个基因和注释

类基因(models.Model):
标识符=models.CharField(最大长度=50,主键=True)
注释=模型.ManyToManyField(注释)
类注释(models.Model):
name=models.CharField(最大长度=120,唯一性=True,主键=True)
我已经找到了一种非常有效地创建对象的方法:

Gene.objects.bulk\u创建([Gene(identifier=identifier)作为Gene\u id\u集合中的标识符])
这是受Django docs启发的建立关系的方法:

关系={
'基因1':['anno1','anno2'],
'基因2':['anno3'],
...
}
对于关系中的基因:
gene=Annotation.objects.get(pk='gene1')
gene.annotation\u set.set([annotation.objects.get(pk=anno)表示关系[gene]中的anno)
但这是非常笨拙的:它会命中数据库4次!使用Django内置工具或其他工具,难道没有更好的方法吗

多对多表(
myapp\u gene\u annotation
)如下所示:

id gene_id   annotation_id
1  gene1       anno1
2  gene1       anno2
3  gene2       anno3
...

现在我们可以创建
Gene\u annotation
对象:Django为
manytomy
表构建了隐式模型,如:

through_model = Gene.annotation.through

objs = [
    through_model(gene_id=gene_id, annotation_id=anno_id)
    for gene_id, rels in relationships.items()
    for anno_id in rels
]
当然,您应该只在添加了
基因
s和
注释
s之后添加关系,否则,数据库端的外键约束将引发错误

这里我们将一次性插入所有关系。如果表很大,这可能会导致多个查询,但仍然比每个关系查询一次更有效

through_model.objects.bulk_create(objs)