我必须将excel文件中的数据导入数据库。 这些文件的结构与模型的结构不匹配,所以我想我需要做一些数据操作来相应地安排这些文件。
我要导入的文件如下所示:
django模型具有以下属性:Country,Commodity,Year,Value
那么最好的方法是读取数据,将其排列在正确的结构中并将其导入数据库(最好是自动更新现有的数据)。
我花了很多时间研究现有的python-和django-libraries以满足这个要求(比如PyExcel,Pandas,Django-Excel,Django-Import-Export),但是我真的不知道哪个是最好的如果它在导入之前支持重新排列数据。
我希望你能为我提供一些建议和解决方案:)
答案 0 :(得分:0)
好的,有几件事。请注意,我不是其中任何一位的专家。
首先,如果您的数据是Excel文件,那么它就是结构化的。表的本质是构造数据。非结构化数据可能类似于文本文件或文本文件目录。
其次,请阅读此内容并在制定问题时遵循:https://stackoverflow.com/help/mcve
第三,SO不是为您编写所有代码的。根据你的问题,你还没有尝试任何事情,这就是为什么你的问题被低估了。
除了前言之外,您可以使用Python的pandas库导入Excel文件,对其进行操作,然后将其上传到SQL数据库。
import pandas as pd
df = pd.read_excel('tmp.xlsx')
df2 = pd.melt(df, id_vars = ['Country', 'Commodity'], var_name = 'Year', value_name = 'Value')
df2
输入:
Country Commodity 2009 2010 2011 2012 2013
0 Austria Com. 1 1 1 1 1 1
1 Austria Com. 2 2 2 2 2 2
2 Belgium Com. 1 3 3 3 3 3
3 France Com. 1 4 4 4 4 4
输出:
Country Commodity Year Value
0 Austria Com. 1 2009 1
1 Austria Com. 2 2009 2
2 Belgium Com. 1 2009 3
3 France Com. 1 2009 4
4 Austria Com. 1 2010 1
如果您有许多Excel文件,可以使用glob
或os.walk
遍历/覆盖目录,并导入部分或全部Excel文件。
您可以使用pandas DataFrame.to_sql
将数据上传到SQL数据库,这需要定义数据库连接(服务器地址,登录/ pw等)。
答案 1 :(得分:0)
这是插入一个外键的示例。
models.py
from django.db import models
class Table1(models.Model):
system = models.CharField(max_length=383)
class Table2(models.Model):
name = models.CharField(max_length=383)
system = models.ForeignKey(Table1, blank=True, null=True, on_delete=models.CASCADE)
您需要创建一个modelResource并覆盖before_import_row以在table1中插入数据。您可以更改字段的名称并创建表格并进行自定义。 '列名'是excel数据中字段的名称,属性是数据库中字段的名称。在方法nefore_import中,您可以在表中插入数据并将外键设为对象。
并将ModelResource设置为admin class。
admin.py
from .models import Table1,Table2
from import_export import resources,widgets
from import_export.fields import Field
from django.contrib import admin
class Table2Resource(resources.ModelResource):
name = Field(column_name='name',attribute='name')
system_id = Field(column_name='system', attribute='system_id', widget=widgets.ForeignKeyWidget(Table1))
class Meta:
model = Table2
skip_unchanged = True
fields = ('name','system_id')
def before_import_row(self,row, **kwargs):
value = row['system']
obj = Table1.objects.create(system = value) #create object place
row['system'] = obj.id # update value to id ob new object
@admin.register(Table2)
class Table2Admin(ImportExportModelAdmin,admin.ModelAdmin):
resource_class = Table2Resource
这就是全部。