当前位置:  开发笔记 > 编程语言 > 正文

如何将Pandas Dataframe写入Django模型

如何解决《如何将PandasDataframe写入Django模型》经验,为你挑选了2个好方法。



1> bakkal..:

在映射到同一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 = ...

现在你可以使用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)

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

我真的没有看到旁边一行读取数据帧然后创建一个模型实例并保存它的方法,这真的很慢.你可能会逃避一些批量插入操作,但为什么麻烦,因为熊猫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()



2> Jon Hannah..:

我现在正在进行同样的练习.我采用的方法是从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)

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有