【问题标题】:python django-import-export import model data even if there are not datapython django-import-export 导入模型数据即使没有数据
【发布时间】:2018-12-19 18:51:52
【问题描述】:

我正在使用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 的字段中的标题和空字符串?

【问题讨论】:

    标签: python django csv django-import-export


    【解决方案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)])
    

    【讨论】:

    • 感谢@vishes_shell,但null=False 也会出现同样的问题。事实是django-import-export好像跳过了自己的模型验证。
    • @Caco 您是否应用了与null=True 更改相关的迁移?
    • 你可以认为是@vishes_shell。
    • @Caco 你能试试我提供的另一个解决方案吗?
    • 我认为可以在更新的答案中解决。再次感谢@vishes_shell。到目前为止,我更喜欢保持模型不变。我不想因为包裹而改变模型。也许这是设置django-import-export Resources 的另一种方式。
    【解决方案2】:

    "为什么 django-import-export 允许为具有blank=False 参数字段的模型保存空字符串" =>

    似乎 django-import-export 忽略了空白参数,但您可以添加 null=False 它也会在 DB 级别添加约束)并且不允许 django-import-export 写入空白行,我假设?你会在过程中得到错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多