【问题标题】:slow process during saving model in database将模型保存在数据库中的过程很慢
【发布时间】:2020-01-10 10:26:59
【问题描述】:

我想在数据库表中保存一个模型列表,但我很慢 当我对每个项目使用 save() 方法时,它花了将近 20 分钟 这是将对象保存到表格的最佳方法吗

Modles.py

class Part(models.Model):
    block           = models.CharField(max_length= 2, null= True)
    phase           = models.CharField(max_length= 3, null= True)
    department      = models.CharField(max_length= 20, null= True)
    type            = models.CharField(max_length= 10, null= True)
    mark            = models.CharField(max_length= 20, null= True)


class Task(models.Model):
    name                = models.CharField(max_length= 20)


class ProjectTask(models.Model):
    project         = models.ForeignKey('Project', on_delete= models.CASCADE)
    task            = models.ForeignKey("Task", on_delete=models.CASCADE)
    weight_percent  = models.FloatField()

class PartTask(models.Model):
    part            = models.ForeignKey('Part', on_delete= models.CASCADE)
    project_task    = models.ForeignKey('ProjectTask', on_delete= models.CASCADE)
    progress        = models.FloatField(null=True)

views.py

def import_part_task(_project_id):
    project_id = _project_id
    project_task    = ProjectTask.objects.all().filter(project= int(project_id[0]))
    part_list       = Part.objects.all()
    part_task_list  = []

    for part in part_list:
        for task in project_task:
            part_task = PartTask()
            part_task.part =part
            part_task.project_task = task
            part_task_list.append(part_task)

   #This ACTION TAKES  VERY LOG TIME
    for part_task in part_task_list:
        PartTask.save(part_task)
    

【问题讨论】:

    标签: django postgresql sqlite django-models


    【解决方案1】:

    这很有意义,因为保存数据库意味着您每次都查询数据库。这需要大量时间。

    但是,您可以通过插入 bulk_create(..) [Django-doc] 来提高性能:

    def import_part_task(_project_id):
        project_id = _project_id
        project_task = ProjectTask.objects.filter(project= int(project_id[0]))
        part_list = Part.objects.all()
        part_task_list = [
            PartTask(part=part, project_task=task)
            for part in part_list
            for task in project_task
        ]
        PartTask.objects.bulk_create(part_task_list)

    通过批量插入,Django 将创建一个查询以通过单个查询插入大量对象,而不是每次都对每个单独的 PartTask 对象进行查询。从而显着减少了到数据库的“往返”次数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-27
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 2010-09-14
      相关资源
      最近更新 更多