有效创建批量数据库条目?

Jac*_* M. 10 django

我正在尝试Activty为一个大型(一次300多个)Inquiry对象列表创建一个对象.我有一个ModelForm被回发的单一,我需要创建单独的实例,并将它们附加到我的Inquiry通过a GenericForeignKey.我们来看一些代码:

models.py:

class InquiryEntry(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField() 
    entry = generic.GenericForeignKey('content_type', 'object_id')

class Inquiry(models.Model):
    entries = models.ManyToManyField('InquiryEntry')
    # And many more fields.
    def add_entry(self, obj):
        entry = self.entries.create(entry=obj)
        self.save()
        return entry

class Activity(models.Model):  
    ts = models.DateTimeField(auto_now_add=True)                  
    due_date = models.DateField(auto_now=False)
    ## And many more fields.
Run Code Online (Sandbox Code Playgroud)

views.py:

def bulk_create_activities(request):
    activity_form = ActivityForm()
    if request.method == "POST":
        activity_form = ActivityForm(request.POST)
        if activity_form.is_valid():    
            pks = [int(x) for x in request.POST.get('pks', '').split(',')]
            for inquiry in Inquiry.objects.filter(pk__in=pks):
                instance = ActivityForm(request.POST).save()
                inquiry.add_entry(instance)     
                inquiry.save()  
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一种将这些插入数据库的方法,最好是一次性传递,以便更快地处理请求.我不想放弃到数据库级别,因为这个应用程序是跨多个数据库供应商部署的,但如果这是继续进行的唯一方法,那么就是这样(MySQL和Postgres的例子很棒).


注意:我知道bulk_create开发版本中有一个,但在有稳定版本之前,这是不可能的.

小智 3

您是否尝试简单地将您的内容封装for在事务结构中?成功提交事务可以显着提高速度,因为条目会一次性批量写入磁盘,因此 DBMS 不必在每个条目之后停止 fsync()。

在最新版本的 django 中实现事务非常快捷,请查看 https://docs.djangoproject.com/en/dev/topics/db/transactions/#controlling-transaction-management-in-views