在Django

时间:2017-07-24 15:07:16

标签: django django-models foreign-keys bulkinsert

我的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表的实例:

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进行插入,但无济于事 有人可以建议一个更好的方法来实现同样的目标 附: Table1,Table2..etc在其主键中已经有db_index = True。

2 个答案:

答案 0 :(得分:0)

使用threading进行多线程怎么样?这将同时创建Ratings对象。

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/

答案 1 :(得分:0)

@Cole我无法回答你的问题。对我有用的是:

@transaction.atomic 

在函数的顶部。它禁用操作之间的任何保存点,并且延迟提交到函数结束。如果您在视图中有大量操作,这可以提高性能