Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django批量创建中使用信号_Python_Django_Signals - Fatal编程技术网

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

Python 如何在django批量创建中使用信号,python,django,signals,Python,Django,Signals,我有这个密码 Task.objects.bulk\u创建(ces) 这是我的信号 @receiver(pre_save, sender=Task) def save_hours(sender, instance, *args, **kwargs): logger.debug('test') 现在,该信号不会在批量创建中触发 我正在使用django 1.8,正如前面提到的bulk\u create不会触发这些信号- 此方法将提供的对象列表插入到中的数据库中 一种高效的方式(通常只有一个

我有这个密码

Task.objects.bulk\u创建(ces)

这是我的信号

@receiver(pre_save, sender=Task)
def save_hours(sender, instance, *args, **kwargs):
    logger.debug('test')
现在,该信号不会在批量创建中触发


我正在使用django 1.8

,正如前面提到的
bulk\u create
不会触发这些信号-

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

不过,这有一些警告:

  • 不会调用模型的save()方法,也不会发送pre_save和post_save信号
  • 它不适用于多表继承场景中的子模型
  • 如果模型的主键是自动字段,它不会像save()那样检索和设置主键属性
  • 它不适用于多对多关系
  • batch_size参数控制在单个查询中创建的对象数量。默认情况下,在一个批中创建所有对象, 除了SQLite之外,SQLite的默认值是最多999个变量 使用每个查询
所以你必须手动触发它们。如果您希望所有型号都使用此功能,您可以覆盖
批量创建
,然后自己这样发送它们-

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()
    ....

重复上面的答案:

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(CustomManager, self).bulk_create(objs,**kwargs)  

用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

问题是,若您使用“ignore_conflicts=True”,那个么您就知道实际上创建了多少实例。例如,它可能是20个中的15个,或19个,或20个或无
objs
可能是一个迭代器,因此更健壮的代码将首先将其转换为一个列表,然后调用super().bulk_create(…),然后迭代项目以发送信号。
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