为什么在Django上使用bulk_create插入带有外键的数据会返回“属性对象不可调用”?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在Django上使用bulk_create插入带有外键的数据会返回“属性对象不可调用”?相关的知识,希望对你有一定的参考价值。
我正在使用带有SQLite 3.26数据库的Django 2.17并尝试从csv文件插入数据。我使用的是get_or_create方法,但速度太慢了。所以我开始尝试使用bulk_create插入。
我使用了以下模型字段:
class SENSOR_TEMPERATURA(models.Model):
ID_Sensor_Temperatura = models.AutoField(primary_key = True)
class VALOR_TEMPERATURA(models.Model):
ID_Valor_Temperatura = models.AutoField(primary_key = True)
ID_Sensor_Temperatura = models.ForeignKey(SENSOR_TEMPERATURA, on_delete = models.PROTECT, null = False, db_column = 'VATE_CD_ID_Sensor_Temperatura')
Data_De_Medição = models.DateTimeField(default = datetime.now(), null = False)
Valor = models.DecimalField(default = 0, null = False, max_digits = 30, decimal_places = 15)
我正在尝试运行的代码是:
print (datetime.datetime.now())
reader = csv.reader(f)
insert_CSV = []
count = 1
for row in reader:
insert_CSV.append([
VALOR_TEMPERATURA.pk(ID_Valor_Temperatura = count),
VALOR_TEMPERATURA(Data_De_Medição = datetime.datetime.strptime(row[0] + " UTC-0300",'%d/%m/%Y %H:%M:%S %Z%z')),
VALOR_TEMPERATURA(Valor = float(row[1])),
VALOR_TEMPERATURA(ID_Sensor_Temperatura = SENSOR_TEMPERATURA.objects.get(ID_Sensor_Temperatura = 4))
])
count = count + 1
print (datetime.datetime.now())
VALOR_TEMPERATURA.objects.bulk_create(insert_CSV)
print (datetime.datetime.now())
我认为让我遇到麻烦的部分是“ID_Sensor_Temperatura = SENSOR_TEMPERATURA.objects.get(ID_Sensor_Temperatura = 4))”,但这正是我在使用get_or_create时定义外键的原因,所以我无法弄清楚是什么问题。
我收到以下错误:
6 for row in reader:
7 insert_CSV.append([
8 VALOR_TEMPERATURA.pk(VATE_CD_ID_Valor_Temperatura = count),
9 VALOR_TEMPERATURA(VATE_DF_Data_De_Medição = datetime.datetime.strptime(row[0] + " UTC-0300",'%d/%m/%Y %H:%M:%S %Z%z')),
10 VALOR_TEMPERATURA(VATE_VL_Valor = float(row[1])),
TypeError: 'property' object is not callable
可能是什么问题?
答案
这不是你编写Python的方式。您需要创建对象的实例,并将值传递给它。
insert_CSV.append(
VALOR_TEMPERATURA(
ID_Valor_Temperatura=count,
Data_De_Medição=datetime.datetime.strptime(row[0] + " UTC-0300",'%d/%m/%Y %H:%M:%S %Z%z')),
Valor=float(row[1]),
ID_Sensor_Temperatura=SENSOR_TEMPERATURA.objects.get(ID_Sensor_Temperatura=4)
)
)
另请注意,不应在ALL_CAPS中定义模型,因为它们不是常量。他们称之为ValorTemperatura和SensorTemperatura。
以上是关于为什么在Django上使用bulk_create插入带有外键的数据会返回“属性对象不可调用”?的主要内容,如果未能解决你的问题,请参考以下文章
Django model中数据批量导入bulk_create()
如何获取使用 django bulk_create 创建的对象的主键