web-dev-qa-db-ja.com

Django一括作成でシグナルを使用するにはどうすればよいですか?

私はこのコードを持っています

Task.objects.bulk_create(ces)

これが私の合図です

@receiver(pre_save, sender=Task)
def save_hours(sender, instance, *args, **kwargs):
    logger.debug('test')

現在、このシグナルは一括作成ではトリガーされません

私はDjango 1.8を使用しています

18
user3214546

前述のように、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()
    ....
18
brainless coder

上記の答えを繰り返します:

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
1
Felipe Sens