我有一个表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"吗?我正在为这件事苦苦挣扎,但仍然找不到解决方法。
提前谢谢。
通过下标在字典中获取相应键的值,如下所示:
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)