Django在执行bulk_create时设置了many_to_many对象

时间:2017-02-13 04:34:37

标签: python django many-to-many

我正在使用Django 1.9并尝试使用bulk_create创建许多新的模型对象,并将它们与常见的相关many_to_many对象相关联。

我的模型如下

#Computational Job object
class OT_job(models.Model):
    is_complete = models.BooleanField()
    is_submitted = models.BooleanField()
    user_email = models.EmailField()

#Many sequences
class Seq(models.Model):
    sequence=models.CharField(max_length=100)
    ot_job = models.ManyToManyField(OT_job)

我有数千个提交的Seq对象,必须与其关联的作业相关联。以前我使用的是迭代器并将它们保存在for循环中。但阅读后意识到Django 1.9有bulk_create。

目前我在做

DNASeqs_list = [] 
for a_seq in some_iterable_with_my_data:
    # I create new model instances and add them to the list
    DNASeqs_list.append(Seq(sequence=..., ))

我现在想要批量创建这些序列并将它们与current_job_object相关联。

created_dnaseqs = Seq.objects.bulk_create(DNASeqs_list)
# How do I streamline this part below
for a_seq in created_dnaseqs:
    # Had to call save here otherwise got an error
    a_seq.save()
    a_seq.ot_job.add(curr_job_obj)

我不得不打电话给#34; a_seq.save()" for for循环,因为我在我正在做的部分出现错误" a_seq.ot_job.add(curr_job_obj)"其中说

....需要为字段" seq"在此之前可以使用多对多关系。

尽管阅读other questions on this topic,我仍然感到困惑,因为与其他人不同,我没有定制"通过"模型。我很困惑如何最好地将OT_Job与许多Seqs关联起来,对数据库的命中率最低。

1 个答案:

答案 0 :(得分:1)

来自文档https://docs.djangoproject.com/en/1.9/ref/models/querysets/#bulk-create

  

如果模型的主键是AutoField,它不会像save()那样检索和设置主键属性。

     

它不适用于多对多关系。

bulk_create字面上只会创建对象,它不会像save那样将PK检索到变量中。您必须重新查询数据库以获取新创建的对象,然后创建M2M关系,但听起来不合适,并且您当前的方法是当前最佳解决方案。