2013-08-22 309 views
1

我有批量更新。每个消息创建我需要调用。发送(网关)这是我曾尝试:Django对象没有属性

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

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

我得到这个错误:

任务请求与ID为流程3ab72d3c-5fd8-4b7d-8cc5- e0400455334f发生异常: 'AttributeError(“\'NoneType \'object has no attribute \'pk \'”,)'

为什么?

回答

4

您正在通过致电对query的每个元素创建objs列表。据推测,send不会返回任何东西,你会得到一个None的列表。试试这个:

objs = [] 
for element in query: 
    message = Message(**kwargs) 
    message.send(gateway) 
    objs.append(message) 

Message.objects.bulk_create(objs) 

**kwargs只是您传递给Message的所有参数的占位符。你可以使用一个字典或只是传递你的原始代码中的所有参数。

作为一个侧面说明,列表解析通常表示当你想要一个新的列表而不是副作用(如发送消息)。这里你需要两个,所以for循环是合适的。

+0

我觉得发送只能保存到数据库时才能调用,因为它不保存,直到批量完成为止,你确定这不是问题吗? – GrantU

+0

如果是这样的话,你的原始'send'也会失败(我的建议不会改变这方面的任何事情)。但是,你应该在没有'.send(gateway)'的情况下做列表理解,并且在调用'bulk_create'之后在'objs'消息对象上执行'for'循环,以便发送它们中的每一个。 –

+0

谢谢@PauloAlmeida。它对我来说非常合适。 –

相关问题