python django-import-export导入模型数据,即使没有数据也是如此

时间:2018-12-19 18:51:52

标签: python django csv django-import-export

我正在使用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,因为已经有效导入了数据,并且一行已添加到数据库中。但是titledescription填充了一个空字符串,即使在Experiment模型中,这两个属性都具有blank=False

我的问题是:为什么django-import-export允许为具有参数blank=False的字段的模型保存空字符串?为什么程序包不检查对应字段模型的数据集标题?

如何使django-import-export在具有blank=False的字段中检查标题和空字符串?

2 个答案:

答案 0 :(得分:1)

这是因为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)])

答案 1 :(得分:0)

“为什么django-import-export可以为具有空白= False参数的字段的模型保存空字符串” =>

似乎django-import-export会忽略空白参数,但您可以添加null = False,这也会在数据库级别上增加约束),并且我不允许django-import-export编写乱码。会在Procass上出现错误