私はこのコードを持っています
Task.objects.bulk_create(ces)
これが私の合図です
@receiver(pre_save, sender=Task)
def save_hours(sender, instance, *args, **kwargs):
logger.debug('test')
現在、このシグナルは一括作成ではトリガーされません
私はDjango 1.8を使用しています
前述のように、bulk_create
はこれらのシグナルをトリガーしません-
https://docs.djangoproject.com/en/1.8/ref/models/querysets/#bulk-create
このメソッドは、提供されたオブジェクトのリストを効率的な方法でデータベースに挿入します(通常、オブジェクトの数に関係なく、クエリは1つだけです)。
ただし、これにはいくつかの注意点があります。
- モデルのsave()メソッドは呼び出されず、pre_saveおよびpost_saveシグナルは送信されません。
- マルチテーブル継承シナリオの子モデルでは機能しません。
- モデルの主キーがAutoFieldの場合、save()のように、主キー属性を取得して設定することはありません。
- 多対多の関係では機能しません。
- Batch_sizeパラメーターは、1回のクエリで作成されるオブジェクトの数を制御します。デフォルトでは、クエリごとに最大999個の変数が使用されるデフォルトのSQLiteを除いて、すべてのオブジェクトを1つのバッチで作成します。
したがって、手動でトリガーする必要があります。すべてのモデルでこれが必要な場合は、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()
....
上記の答えを繰り返します:
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