2017-02-13 8 views
0

私はDjango 1.9を使用しています。bulk_createを試して多数の新しいモデルオブジェクトを作成し、共通のmany_to_manyオブジェクトに関連付けます。Djangoは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) 

私が提出された配列オブジェクトの数千を持っているとそれに関連付けられたジョブに関連する必要があるが、以下のように

私のモデルがあります。以前はイテレータを使っていましたが、それを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=...,)) 

をやっている私は今、これらのシーケンスをbulk_createと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) 

私は

を言った「a_seq.ot_job.add(curr_job_obj)」をやっていた部分でエラーが発生しましたので、forループで「a_seq.saveを()」を呼び出す必要がありました。 ...この多対多の関係が使用される前に、フィールド "seq"の値を持つ必要があります。

other questions on this topicを読んでいるにもかかわらず、他の人と違って私はカスタム "スルー"モデルを持っていないので、私はまだ混乱しています。私は、OT_Jobをデータベースへのヒット数を最小限に抑えて、多くのSeqと関連付ける最良の方法と混同しています。ドキュメントhttps://docs.djangoproject.com/en/1.9/ref/models/querysets/#bulk-createから

答えて

1

モデルの主キーは、(名前を付けて保存、それは主キー属性を取得し、設定していないのAutoFieldある場合)ん。

多対多リレーションシップでは機能しません。

bulk_createは文字通りsaveはないとして、それが変数にPKを取得しません、オブジェクトを作成します。新しく作成されたオブジェクトを取得するためにデータベースを再クエリし、M2Mリレーションシップを作成する必要がありますが、それは適切ではないと思われ、現在の方法が現在最適なソリューションです。

+0

ありがとうございます。私はドキュメントのその点を逃した。また、なぜbulk_createを使ったStackOverflowの他のいくつかの例がbulk_createの直後に検索を行う理由が分かりました。 – harijay

関連する問題