python - 为什么在 Django 上使用bulk_create插入带有外键的数据会返回 "property object is not callable"?

标签 python django sqlite

我正在使用 Django 2.17 和 SQLite 3.26 数据库,并尝试从 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。

关于python - 为什么在 Django 上使用bulk_create插入带有外键的数据会返回 "property object is not callable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55337949/

相关文章:

python - 如何在 django 的日历应用程序中找到 "week"?

python - 在 matplotlib 字幕中偏移一个字符

python - 如何从 Python (2.7) 中生成的进程中删除 Windows 控制台?

python - 具有多种内容类型的 Django prefetch_related GenericForeignKey

php - 使用 PHP 的大量 SQLite 插入

Python:强制新型类

django - 如何动态更新 Form ChoiceField 中的 'initial' 值

python - 尝试基于嵌套模型外键过滤 django View 序列化器

c - 如何使用 C 在 sqlite3 中使用参数化查询更新列?

Java/JDBC/SQLite - 更新 BLOB 问题