2013-08-24 3 views
0

В обращении к следующему bulk_create запроса:bulk_create как вызвать функцию на каждом объекте

objs = [ 
     Message(
      recipient_number=e.mobile, 
      content=content, 
      sender=e.contact_owner, 
      billee=user, 
      sender_name=sender, 
      gateway=gateway, 
     ) 
     for e in query 

    ] 
    # Send messages to DB 
    Message.objects.bulk_create(objs) 

Мой вопрос:

Я должен использовать bulk_create (по соображениям производительности). Однако мне нужно вызвать instance.send(gateway) на каждый созданный объект.

Использование навалом создать я, кажется, не beable сделать это, потому что ПК не обязательно для post_save сигнала смысла это не будет работать ....

@receiver(post_save, sender=Message) 
def my_post_save_handler(sender, instance, **kwargs): 
    instance.send(instance.gateway) 

post_save.connect(my_post_save_handler, sender=Message) 

Так что я попробовал несколько других вещей, как это ....

objs = [ 
    Message(
     etc... 
    ).send(gateway) 
    for e in query 

] 

снова это не будет работать.

Этот вопрос заставляет меня немного сумасшедшим, это очень просто, поэтому какие варианты у меня есть с примером?

Я не хочу использовать create, должен оставаться с bulk_create, поскольку я вставляю миллионы объектов!

спасибо. :)

+1

При создании 'list' миллионов объектов не является проблемой, то вы можете добавить поле флага, что указывало бы на отправлено ли сообщение, а после того, как 'bulk_create' извлечет все объекты с этим флагом, не установленным (или подмножеством полей) и выполнив отправку. –

+0

Это хорошая идея – GrantU

+0

Просто любопытство: как миллионы объектов вписываются в строку запроса? Я имею в виду, что вы настроили свой db или сделали некоторые оптимизации django-side? Я предполагаю, что было бы сложно отправить несколько мегабайт запросов на сервер. –

ответ

1

Вы пытаетесь сохранить результат отправки, но отправите его. Вместо этого вы должны позвонить отправить в каждом объекте, в свою очередь, а затем отправить все объекты bulk_create:

for obj in objs: 
    obj.send(gateway) 
Message.objects.bulk_create(objs) 
+0

Нет, отправьте сообщение. Сообщение должно быть сохранено до того, как я смогу позвонить (шлюз), т. Е. Он должен быть выполнен после сохранения сообщения. – GrantU