我正在使用django-import-export
包从csv文件导入数据,基本上遵循readthedocs中的入门教程
我对简单配置中软件包的行为感到困惑。
我的模型是这样的:
class Experiment(models.Model):
title = models.CharField(max_length=255, blank=False)
description = models.TextField(blank=False)
research_project = models.ForeignKey(
ResearchProject, null=False, blank=False
)
我创建了一个csv文件来测试导入。文件
/tmp/experiment.csv
很简单:h1,h1,research_project
v1,v2,66
(请注意,csv的前两列的标题与任何字段模型都不对应)
然后,我创建了一个资源:
class ExperimentResource(resources.ModelResource):
class Meta:
model = Experiment
exclude = ('id', )
def export(self, queryset=None, *args, **kwargs):
queryset = Experiment.objects.filter(id=kwargs['id'])
return super(ExperimentResource, self).export(queryset, *args, **kwargs)
def get_instance(self, instance_loader, row):
return False
现在,我可以尝试通过调用以下命令来导入
/tmp/experiment.csv
数据:dataset = Dataset().load(open('/tmp/experiment.csv').read())
result = ExperimentResource().import_data(dataset)
print(result.has_errors()) # for debug
最后一行打印
False
,因为已有效导入数据,并且一行已添加到数据库中。但是title
和description
用空字符串填充,即使在Experiment
模型中,这两个属性都具有blank=False
。我的问题是:为什么
django-import-export
允许为具有带有blank=False
参数的字段的模型保存空字符串?以及为什么程序包不检查对应字段模型的数据集标题?如何使
django-import-export
在具有blank=False
的字段中检查标题和空字符串? 最佳答案
这是因为blank=False
仅与表单有关,如文档blank
中所述:
如果为True
,则该字段允许为空白。默认值为False。
请注意,这与null
不同。 null
纯粹是
与数据库有关,而blank
与验证有关。如果一个字段有
blank=True
,表单验证将允许输入一个空值。如果一个
字段具有blank=False
,则必填字段。
如果不想禁止保存空值,请设置null=False
,但设置be aware of null
for CharField
更新:由于上述解决方案没有帮助,因此另一个可能的解决方案是在CharField
字段上提供验证器。 MinLengthValidator可以帮助您验证非空字段。
如下应用:
title = models.CharField(max_length=255, blank=False, validators=[MinLengthValidator(1)])
description = models.TextField(blank=False, validators=[MinLengthValidator(1)])