在导入之前检查.csv文件的格式是否正确,以避免将错误的数据嵌入数据库



我正在处理一个django项目,该项目需要使用excelsheet格式提供的批量数据更新数据库。因此,基本上,如果.csv文件的格式正确(我指的是格式正确的文件,包含我期望的数据(,用户就可以上传它。我知道如何使用django导入导出导入文件,但问题是,在更新数据库之前,我不知道如何执行检查,比如检查.csv文件是否有正确的列名和信息。我是姜戈的新手,请帮帮我。

检查格式正确的文件

如果您正在以编程方式导入文件,那么如果您可以加载数据集对象,而不会引发任何错误,那么它就是一个格式良好的csv文件。所以类似于:

import tablib
try:
with open('data.csv', 'r') as fh:
imported_data = tablib.Dataset().load(fh, headers=False)
except Exception as e:
# you can add additional error handling / logging here if you like
print("import fail")
raise e

检查标题是否正确

在导入过程之前,有一个钩子可以用来检查有效的头。因此,您可以执行以下操作来检查缺少的列:

class YourResource(resources.ModelResource):
fields = ('author', 'email')
def before_import(self, dataset, using_transactions, dry_run, **kwargs):
for field_name in self.fields:
col_name = self.fields[field_name].column_name
if col_name not in dataset.headers:
raise ValueError(f"'{col_name}' field not in data file")

数据验证

您可以使用内置的小部件在字段级别提供额外的验证。您可以随意扩展这些功能,以启用其他特定于域的验证。例如,如果您只想允许"1"或"0"作为布尔值,则可以实现以下内容:

class StrictBooleanWidget(widgets.BooleanWidget):
TRUE_VALUES = ["1"]
FALSE_VALUES = ["0"]
NULL_VALUES = [""]
def clean(self, value, row=None, *args, **kwargs):
if value in self.NULL_VALUES:
return None
if value in self.TRUE_VALUES:
return True
if value in self.FALSE_VALUES:
return False
raise ValueError("Invalid boolean: value must be 1 or 0.")

然后参考你的资源:

class YourResource(resources.ModelResource):
is_active = fields.Field(
attribute="active",
column_name="active",
default=False,
widget=upload.widgets.StrictBooleanWidget(),
)

您也可以使用这种方法来检查数据中是否缺少值或空值。

django-import-export确实对您描述的用例有很大帮助,但当您是新手时,它可能会让您感到困惑。深入阅读文档,我建议下载并运行示例应用程序(如果您还没有(。

核心导入逻辑相当简单,但如果你能在开发过程中设置断点并逐步完成,它将节省大量时间。这将真正帮助你了解发生了什么。

最新更新