首页 > 解决方案 > 使用 Django bulk_create() 函数时,“dict”对象没有属性“pk”

问题描述

我有一个counters包含 2 个字段的表:datevalue.

我有一大堆需要插入到表中的对象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' 吗?我在这件事上苦苦挣扎了好几个小时,但我仍然找不到解决办法。

提前致谢。

标签: pythondjango

解决方案


您可以通过subscripting获取字典中对应键的值,例如:

objs = [CounterFileData(date=row['date'], value=row['value']) for row in parsed_data]

此外,您传递parsed_datalist(..)构造函数,而它应该是objs。然而,通过使用列表推导,我们可以省略它。

batch = [CounterFileData(date=row['date'], value=row['value']) for row in parsed_data]
CounterFileData.objects.bulk_create(batch)

推荐阅读