共计 2538 个字符,预计需要花费 7 分钟才能阅读完成。
要从 django 后台导入的 excel 中批量解析数据,举一个例子,我们向后抬批量导入 svn 历史数据
数据格式
MacDown logo
假设 excel 表中有 4 列,每列分别是版本号,属性,属性值,仓库地址
2. 第一步,新建一个 app,然后在 app 中新建 model
@python_2_unicode_compatible
class KNSVNHistory(models.Model):
revision = models.IntegerField(verbose_name=u"修订版本", blank=True, null=True)
prop = models.CharField(verbose_name=u'SVN 属性', choices=constants.YD_SVN_PROP_CHOICE, max_length=60,
default=constants.YD_SVN_PROP_DATE)
value = models.TextField(verbose_name=u"SVN 属性值", blank=False, null=False, default=u"")
repo = models.CharField(max_length=100, verbose_name=u"SVN 仓库", blank=False, null=False)
editor = models.ForeignKey(User, verbose_name=u"编辑者", blank=True, null=True)
ctime = models.DateTimeField(verbose_name=u"创建时间", auto_now_add=True,)
mtime = models.DateTimeField(verbose_name=u"修改时间", auto_now=True,)
class Meta:
ordering = ['ctime']
def __str__(self):
return self.value
如上代码,我自己创建了用来保存数据的 model,方便我们从后台导入数据
接下来我们创建后台上传文件的接口
@python_2_unicode_compatible
class ImportFile(models.Model):
file = models.FileField(upload_to='File')
name = models.CharField(max_length=50, verbose_name=u'文件名')
class Meta:
ordering = ['name']
def __str__(self):
return self.name
下面就是我们解析 excle 的功能部分,在 app 下新建一个 utils.py 文件
from openpyxl import Workbook,load_workbook
from openpyxl.utils import get_column_letter
from .models import KNSVNHistory
from openpyxl.compat import range
def import_user(self, request, obj, change):
wb = load_workbook(filename=obj.YDUserFile.path)
ws = wb.get_sheet_names()
ws = wb.get_sheet_by_name(ws[0])
headers = ['version', 'attr', 'value', 'addr']
lists = []
users = request.user
for row in range(2, 5):
r = {}
for col in range(1, len(headers) + 1):
key = headers[col - 1]
r[key] = ws.cell(row=row, column=col).value
lists.append(r)
sqllist = []
for cell in lists:
# for header in headers:
revision = cell['version']
prop = cell['attr']
value = cell['value']
repo = cell['addr']
sql = KNSVNHistory(revision=revision, prop=prop, value=value, repo=repo, editor=users)
sqllist.append(sql)
KNSVNHistory.objects.bulk_create(sqllist)
打开 admin.py
因为我们要在后台保存,所以我们需要重写 ModelAdmin 的 save_mode
from .utils import import_user
class KNImportFileAdmin(admin.ModelAdmin):
list_display = ('file','name',)
list_filter = ['name',]
def save_model(self, request, obj, form, change):
re = super(YDImportFileAdmin,self).save_model(request, obj, form, change)
import_user(self, request, obj, change)
return re
在上面的代码中使用了第三方库 openpyxl 来解析 excel
关键点在于获取文件对象的时候,我们是通过传过来的 obj 对象来获取 fileobj,其实通俗来讲就是在我们点击上传的时候,重写的 save_mode 方法拦截了整个对象,我们在这里拿出我们要解析的 excel 文件对象进行解析,后面的解析过程也比较简单,我们将每行数据解析之后通过字典来保存,然后再用 key 访问取到进行数据库操作,在数据库操作的时候我们使用 KNSVNHistory.objects.bulk_create 来提高效率。
总结, 整个过程的难点在于获取文件对象,从数据中取值然后在按 key 取出,这样我们就可以从后台上传 excel 文件,然后进行批量导入数据库,其他数据格式只需要改 utils 和 model 中的数据字段就可以
如果想交流其它 python 和 django 的问题可关注本人公众号