python - 使用 Django bulk_create() 函数时,“dict”对象没有属性“pk”
问题描述
我有一个counters
包含 2 个字段的表:date
和value
.
我有一大堆需要插入到表中的对象counters
。但是对列表中的每一行使用serializer.save(),会有很多插入,如果我有很多数据,数据插入完成需要一些时间。
为了解决这个问题,我查看了 Django 的文档,发现有一个函数名称bulk_create
可以帮助我在 1 个查询中将对象列表插入表中。
现在,这是我的代码:
models.py
:
class CounterFileData(models.Model):
date = models.DateTimeField()
value = models.FloatField()
serializers.py
:
class CounterFileDataSerializer(serializers.ModelSerializer):
class Meta:
model = CounterFileData
fields = ['date', 'value']
和我使用的代码bulk_create
:
objs = (CounterFileData(date=row.date, value=row.value) for row in parsed_data)
batch = list(parsed_data)
CounterFileData.objects.bulk_create(batch)
row
具有以下架构。例如:
{
"date": "2018-12-31T22:00:00"
"value": 9.23129792740622e-05
}
当我尝试这样做时,CounterFileData.objects.bulk_create(batch)
我收到以下错误:
AttributeError: 'dict' object has no attribute 'pk'
有人能告诉我为什么它没有返回属性 'pk' 吗?我在这件事上苦苦挣扎了好几个小时,但我仍然找不到解决办法。
提前致谢。
解决方案
您可以通过subscripting获取字典中对应键的值,例如:
objs = [CounterFileData(date=row['date'], value=row['value']) for row in parsed_data]
此外,您传递parsed_data
给list(..)
构造函数,而它应该是objs
。然而,通过使用列表推导,我们可以省略它。
batch = [CounterFileData(date=row['date'], value=row['value']) for row in parsed_data]
CounterFileData.objects.bulk_create(batch)
推荐阅读
- regex - 使用 Perl 的正则表达式查找项目
- qt - QT QProcess cmd & tptf
- linux - 在 Byobu 中,仅在同一分屏中用鼠标选择
- java - 代号一:滚动时固定按钮
- asp.net-web-api - ASP.NET Core WEB API 配置文件问题
- python - 打开文件时出错:IOError: [Errno 0] Error
- firebase - Flutter Cloud Firestore 地图
错误 - jmeter - 如何在 Jmeter 脚本中下载 CSV 文件
- redis - Kubernetes 如何在不使用环境变量的情况下在微服务中使用 Redis 主机和端口
- puppet - 带有条件语句的 Puppet 重复声明错误