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)