2013-08-24 44 views
0

上。在參考以下bulk_create查詢:bulk_create如何調用函數的每個對象

objs = [ 
     Message(
      recipient_number=e.mobile, 
      content=content, 
      sender=e.contact_owner, 
      billee=user, 
      sender_name=sender, 
      gateway=gateway, 
     ) 
     for e in query 

    ] 
    # Send messages to DB 
    Message.objects.bulk_create(objs) 

我的問題:

我必須使用bulk_create(由於性能原因)。不過,我需要在每個創建的對象上調用instance.send(gateway)

使用批量創建我似乎沒有比布爾做,因爲PK不一定適用於post_save信號意義,這將不起作用 ....

@receiver(post_save, sender=Message) 
def my_post_save_handler(sender, instance, **kwargs): 
    instance.send(instance.gateway) 

post_save.connect(my_post_save_handler, sender=Message) 

所以我已經嘗試了其他一些像這樣的事情....

objs = [ 
    Message(
     etc... 
    ).send(gateway) 
    for e in query 

] 

再次這是不行的。

這個問題讓我有些生氣,這很簡單,所以我有什麼樣的選擇?

我不會使用create,必須保留bulk_create,因爲我插入了數百萬個對象!

謝謝。 :)

+1

如果創建的數百萬個對象的'list'是沒有問題的,那麼你可以添加一個標誌字段,這將表明是否已經發送消息,並且在'bulk_create'之後獲取未設置該標誌的所有對象(或者字段的子集)並且執行發送。 –

+0

這是一個好主意 – GrantU

+0

只是好奇心:數百萬個對象如何適合查詢字符串?我的意思是,你調整了你的數據庫還是做了一些Django端優化?我想這將很難發送幾兆字節的查詢到服務器。 –

回答

1

您正試圖保存發送的結果,但發送返回無。相反,你應該叫送依次以每一個對象,然後把所有的對象bulk_create:

for obj in objs: 
    obj.send(gateway) 
Message.objects.bulk_create(objs) 
+0

不,發送消息。消息必須在我可以呼叫發送(網關)之前保存,即必須在保存消息後完成。 – GrantU

相關問題