使用Django bulk_create()函数时,'dict'对象没有属性'pk'

时间:2019-07-26 12:28:51

标签: python django

我有一个表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'属性吗?我正在努力工作好一些,但仍然找不到解决方法。

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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)