2017-07-24 70 views
0
多個外鍵

我在我的Django應用程序以下型號:批量創建的對象包含在Django

class Ratings(models.Model): 
    field1 = models.ForeignKey(Table1) 
    field2 = models.ForeignKey(Table2) 
    field3 = models.ForeignKey(Table3) 
    field4 = models.ForeignKey(Table4) 
    field5 = models.ForeignKey(Table5) 

class Values(models.Model): 
    grade = models.ForeignKey(Grade) 
    rating = models.ForeignKey(Ratings, related_name='ratings') 
    value = models.TextField(blank=True, null=True) 

我使用下面的代碼來創建等級表的實例:

rating_obj = Ratings(
        field1_id=id1, 
        field2_id=id2, 
        field3_id=id3, 
        field4_id=id4, 
        field5_id=id5 
       ) 
       rating_obj.save() 

上述方法可行,但速度太慢。我必須創建約30個這種模型的實例。我無法使用bulk_create因爲我需要參照rating_obj創建對象。我已經嘗試使用raw_sql進行插入,但無濟於事。
有人可以提出一個更好的方法來實現相同的目標。
P.S. Table1,Table2..etc在其主鍵中已經具有db_index = True。

回答

0

如何使用threading多線程?這將同時創建評級對象。

import threading 

def createRatings(id1, id2, id3, id4, id5): 
    return Ratings(
     field1_id=id1, 
     field2_id=id2, 
     field3_id=id3, 
     field4_id=id4, 
     field5_id=id5 
    ).save() 

for ids in idsList: 
    threading.Thread(
     target=createRatings, 
     args=(
      ids[0], 
      ids[1], 
      ids[2], 
      ids[3], 
      ids[4], 
      ids[5], 
     ) 
    ).start() 

來源:https://pymotw.com/2/threading/

0

@Cole我不能試試你的答案。對我來說有效的是:

@transaction.atomic 

位於函數的頂部。它禁用操作之間的任何保存點,並延遲提交到函數結尾。如果您在視圖中進行了大量操作,這可實現更快的性能