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

use*_*546 17 python django signals

我有这个代码

Task.objects.bulk_create(ces)

现在这是我的信号

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

现在这个信号不会在批量创建中触发

我正在使用django 1.8

bra*_*der 18

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

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

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

这有几点需要注意:

  • 不会调用模型的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
Run Code Online (Sandbox Code Playgroud)

然后使用这个经理 -

class Task(models.Model):
    objects = CustomManager()
    ....
Run Code Online (Sandbox Code Playgroud)


小智 5

迭代上面的答案:

蟒蛇2:

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

蟒蛇3:

class CustomManager(models.Manager):
    def bulk_create(self, objs, **kwargs):
        #Your code here
        return super(CustomManager, self).bulk_create(objs,**kwargs)  
Run Code Online (Sandbox Code Playgroud)
class Task(models.Model):
    objects = CustomManager()
    ....
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)