我如何在django批量创建中使用信号

时间:2015-06-03 23:49:44

标签: python django signals

我有这段代码

Task.objects.bulk_create(ces)

现在这是我的信号

@receiver(pre_save, sender=Task)
def save_hours(sender, instance, *args, **kwargs):
    logger.debug('test')

现在批量创建

未触发此信号

我正在使用django 1.8

2 个答案:

答案 0 :(得分:14)

如上所述,bulk_create不会触发这些信号 -

https://docs.djangoproject.com/en/1.8/ref/models/querysets/#bulk-create

  

此方法将提供的对象列表插入到数据库中   一种有效的方式(通常只有一个查询,无论多少   对象有。)

     

但是有一些警告:

     
      
  • 不会调用模型的save()方法,也不会发送pre_save和post_save信号。
  •   
  • 在多表继承方案中,它不适用于子模型。
  •   
  • 如果模型的主键是AutoField,它不会像save()那样检索和设置主键属性。
  •   
  • 它不适用于多对多关系。
  •   
  • batch_size参数控制在单个查询中创建的对象数。默认是在一个批次中创建所有对象,   除了SQLite,其中默认值最多为999个变量   使用每个查询。
  •   

所以你必须手动触发它们。如果你想为所有模特设置这个,你可以覆盖bulk_create并像这样自己发送 -

class CustomManager(models.Manager):
    def bulk_create(items,....):
         super().bulk_create(...)
         for i in items:
              [......] # code to send signal

然后使用此经理 -

class Task(models.Model):
    objects = CustomManager()
    ....

答案 1 :(得分:0)

迭代以上答案:

Python 2:

class CustomManager(models.Manager):
    def bulk_create(self, objs, **kwargs):
        #Your code here
        return super(models.Manager,self).bulk_create(objs,**kwargs)  

Python 3:

class CustomManager(models.Manager):
    def bulk_create(self, objs, **kwargs):
        #Your code here
        return super().bulk_create(objs,**kwargs)  

class Task(models.Model):
    objects = CustomManager()
    ....

在python 2中完成答案:

class CustomManager(models.Manager):

def bulk_create(self, objs, **kwargs):
    a = super(models.Manager,self).bulk_create(objs,**kwargs)
    for i in objs:
        post_save.send(i.__class__, instance=i, created=True)
    return a