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