Python Django对象没有属性
我有一个批量更新。我需要调用创建的每条消息。发送(网关)这是我尝试过的:Python Django对象没有属性,python,django,django-models,Python,Django,Django Models,我有一个批量更新。我需要调用创建的每条消息。发送(网关)这是我尝试过的: objs = [ Message( recipient_number=e.mobile, content=content, sender=e.contact_owner,
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\'对象没有属性'pk\'”,)'
为什么? 在
query
的每个元素上调用send
,创建objs
列表。大概,send
不会返回任何内容,您会得到一个None
列表。试试这个:
objs = []
for element in query:
message = Message(**kwargs)
message.send(gateway)
objs.append(message)
Message.objects.bulk_create(objs)
**kwargs
只是传递给消息的所有参数的占位符。您可以使用字典,也可以像原始代码一样传递所有参数
作为补充说明,列表理解通常在您需要新列表时指示,而不是用于副作用(如发送消息)。在这里,您想要两者,因此
for
循环是合适的。您正在通过调用send
对query
的每个元素创建objs
列表。大概,send
不会返回任何内容,您会得到一个None
列表。试试这个:
objs = []
for element in query:
message = Message(**kwargs)
message.send(gateway)
objs.append(message)
Message.objects.bulk_create(objs)
**kwargs
只是传递给消息的所有参数的占位符。您可以使用字典,也可以像原始代码一样传递所有参数
作为补充说明,列表理解通常在您需要新列表时指示,而不是用于副作用(如发送消息)。这里您想要两者,因此
for
循环是合适的。我认为只有在保存到数据库时才能调用send,因为它在批量完成之前不会保存。您确定这不是问题所在吗?如果是这样,您原来的send
也会失败(我的建议在这方面没有任何改变)。但是,在调用bulk\u create
之后,您应该在不使用.send(gateway)
的情况下执行列表理解,并在objs
消息对象上执行for
循环,以发送它们中的每一个。我认为只有在保存到数据库时才能调用send,由于它在批量完成之前不会保存,您确定这不是问题吗?如果是这样,您原来的send
也会失败(我的建议在这方面没有任何改变)。但是,在调用bulk\u create
之后,您应该在不使用.send(gateway)
的情况下执行列表理解,并在objs
消息对象上执行for
循环,以发送每个对象。