【问题标题】:bulk_create how to call function on each objectbulk_create 如何在每个对象上调用函数
【发布时间】:2013-08-24 18:17:39
【问题描述】:

参考以下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)

使用批量创建我似乎无法做到这一点,因为 PK 不一定可用于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!

谢谢。 :)

【问题讨论】:

  • 如果创建数百万个对象的list 不成问题,那么您可以添加一个标志字段来指示消息是否已发送,并在bulk_create 之后使用此获取所有对象标记未设置(或字段子集)并执行发送。
  • 只是好奇:数以百万计的对象如何适合查询字符串?我的意思是,您是否调整了数据库或在 django 方面进行了一些优化?我想向服务器发送几兆字节的查询会很困难。
  • 你不能循环objs并在批量创建后发送每个吗?

标签: python django django-models


【解决方案1】:

您正在尝试保存发送的结果,但发送返回无。相反,您应该依次在每个对象中调用 send,然后将所有对象发送到 bulk_create:

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

【讨论】:

  • 不,发送推送消息。在我可以调用 send(gateway) 之前必须保存消息,即必须在保存消息后完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多