我有这段代码
Task.objects.bulk_create(ces)
现在这是我的信号
@receiver(pre_save, sender=Task)
def save_hours(sender, instance, *args, **kwargs):
logger.debug('test')
现在批量创建
未触发此信号我正在使用django 1.8
答案 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