如何将Pandas Dataframe写入Django模型

Ava*_*gut 13 python django postgresql dataframe pandas

我一直在python中使用pandas,我通常会将数据帧写入我的db表,如下所示.我现在正在迁移到Django,如何通过名为MyModel的模型将相同的数据帧写入表中?援助真的很感激.

# Original pandas code
    engine = create_engine('postgresql://myuser:mypassword@localhost:5432/mydb', echo=False)
    mydataframe.to_sql('mytable', engine,if_exists='append',index=True)
Run Code Online (Sandbox Code Playgroud)

bak*_*kal 16

在映射到同一SQL表的Django模型旁边使用您自己的pandas代码

我不知道有任何明确的支持将pandas数据帧写入Django模型.但是,在Django应用程序中,除了使用ORM(例如通过Django模型)之外,您仍然可以使用自己的代码来读取或写入数据库.

鉴于您很可能在数据库中拥有以前由pandas编写的数据to_sql,您可以继续使用相同的数据库和相同的pandas代码,只需创建一个可以访问该表Django模型

例如,如果你的pandas代码写入SQL表mytable,只需创建一个这样的模型:

class MyModel(Model):
    class Meta:
        db_table = 'mytable' # This tells Django where the SQL table is
        managed = False # Use this if table already exists
                        # and doesn't need to be managed by Django

    field_1 = ...
    field_2 = ...
Run Code Online (Sandbox Code Playgroud)

现在你可以使用Django中的这个模型与现有的pandas代码同时使用(可能在一个Django应用程序中)

Django数据库设置

要将相同的DB凭据放入pandas SQL函数,只需从Django设置中读取字段,例如:

from django.conf import settings

user = settings.DATABASES['default']['USER']
password = settings.DATABASES['default']['PASSWORD']
database_name = settings.DATABASES['default']['NAME']
# host = settings.DATABASES['default']['HOST']
# port = settings.DATABASES['default']['PORT']

database_url = 'postgresql://{user}:{password}@localhost:5432/{database_name}'.format(
    user=user,
    password=password,
    database_name=database_name,
)

engine = create_engine(database_url, echo=False)
Run Code Online (Sandbox Code Playgroud)

不推荐替代方案,因为它效率低下

我真的没有看到旁边一行读取数据帧然后创建一个模型实例并保存它的方法,这真的很慢.你可能会逃避一些批量插入操作,但为什么麻烦,因为熊猫to_sql已经为我们做了这件事.将pangas查询集读入pandas数据帧只是效率低下,而pandas也能为我们做得更快.

# Doing it like this is slow
for index, row in df.iterrows():
     model = MyModel()
     model.field_1 = row['field_1']
     model.save()
Run Code Online (Sandbox Code Playgroud)


Jon*_*nah 14

我现在正在进行同样的练习.我采用的方法是从DataFrame创建一个新对象列表,然后批量创建它们:

bulk_create(objs,batch_size = None)

此方法以有效的方式将提供的对象列表插入到数据库中(通常只有1个查询,无论有多少个对象)

示例可能如下所示:

# Not able to iterate directly over the DataFrame
df_records = df.to_dict('records')

model_instances = [MyModel(
    field_1=record['field_1'],
    field_2=record['field_2'],
) for record in df_records]

MyModel.objects.bulk_create(model_instances)
Run Code Online (Sandbox Code Playgroud)

  • 但你又在循环```for record in df_records``` (2认同)
  • 我认为问题的重点是避免 for 循环并调用 `MyModel` 构造函数 (2认同)