Django bulk_create返回列表引发AttributeError:'list'对象无'id'属性
解决bulk_create后访问id报错的问题
我一眼就看出问题所在啦——你把bulk_create()的返回值当成单个对象来用了,但实际上它返回的是创建好的对象实例组成的列表,直接访问client.id当然会报错,因为列表本身没有id属性呀!
问题根源
Client.objects.bulk_create()执行后,会返回一个包含所有创建成功的Client对象的列表,你把这个列表赋值给了client变量,后续代码里如果想用client.id,就相当于在操作一个列表,自然会抛出AttributeError: 'list' object has no attribute 'id'。
解决办法
根据你的需求,分两种情况处理:
1. 需要访问单个Client的id
从返回的列表中取出对应的对象,再访问它的id属性就行:
# 建议把变量名改成clients,更直观,避免混淆 clients = Client.objects.bulk_create([ Client(name='WaltDisnep', created_at=timezone.now(), updated_at=timezone.now()), Client(name='Google', created_at=timezone.now(), updated_at=timezone.now()), Client(name='JetAirways', created_at=timezone.now(), updated_at=timezone.now()) ]) # 比如要关联第一个Client到Building building = Building.objects.create(description='TestBuilding', client=clients[0]) # 或者访问第二个Client的id:clients[1].id
2. 数据库不支持bulk_create返回主键的情况
注意:不是所有数据库都支持在bulk_create后自动给返回的对象填充主键(比如旧版SQLite、某些配置下的MySQL),如果遇到返回的对象没有id的情况,你可以在创建完成后重新查询数据库获取:
# 先执行bulk_create创建对象 Client.objects.bulk_create([ Client(name='WaltDisnep', created_at=timezone.now(), updated_at=timezone.now()), Client(name='Google', created_at=timezone.now(), updated_at=timezone.now()), Client(name='JetAirways', created_at=timezone.now(), updated_at=timezone.now()) ]) # 通过查询获取带id的对象列表 clients = Client.objects.filter(name__in=['WaltDisnep', 'Google', 'JetAirways'])
小建议
把变量名从client改成clients,这样自己看代码的时候也能立刻意识到这是个列表,不容易再犯类似的错误~
内容的提问来源于stack exchange,提问作者user8817894
相关产品推荐
相关产品推荐

