您的位置:

django有LayerMapError('Given mapping OGR field "%s" not found in OGR Layer.' % ogr_map_fld)报错是怎么回事

  发布时间:2023-03-31 14:20:52
报错的原因这个错误通常是由于使用库时,OGRLayer地图字段映射问题导致的。这可能是由于OGRLayer 与数据文件中的字段名称不匹配,检查OGRLayer 层中的字段名称和数据文件中的字段名称是否一致。此外可以使用 Field 参数来指定映射关系,这样可以避免映射关系配置错误。使用例子假设你有一个模型 "MyModel" 和一个数据文件在 MyModel 中定义了 name 和 age 两个字段,而在 "data.csv" 中有 name 和 birthday 两个字段。如果你尝试使用库将 "data.csv" 中的数据导入 MyModel,可能会出现 LayerMapError 错误。

报错的原因

这个错误通常是由于使用django-import-export库时,OGRLayer地图字段映射问题导致的。

导致这个错误的一种常见原因是,在导入的数据中,有某些字段与模型中定义的字段不匹配。例如,如果你尝试导入包含"first_name"字段的数据,而模型中定义的字段是"firstname"。

解决方案是确认数据文件中字段名称与定义模型中字段名称是否一致,或者使用‘Fields’参数来指定映射关系。

导致这个错误的另一种原因是你在配置文件中指定的映射关系错误。例如,在Resource中指定的映射字段名称与数据文件中字段名称不匹配。

解决方案是确认Resource配置文件中的映射关系是否正确,确认导入的数据文件中的字段名称是否与配置文件中指定的字段名称一致。

总之这个错误通常是由于映射关系配置问题导致的, 要确认你配置的映射关系是否正确和与数据文件中的字段名称是否一致

在使用 django-import-export 库时,还有可能是因为 OGR 层不存在该字段导致的。这可能是由于OGRLayer 与数据文件中的字段名称不匹配,检查OGRLayer 层中的字段名称和数据文件中的字段名称是否一致。

解决方法可以是确认OGRLayer 层中的字段名称和数据文件中的字段名称是否一致,并进行修改使其匹配。

总之,这个错误通常是由于映射关系配置问题导致的,要确认你配置的映射关系是否正确和与数据文件和OGRLayer层中的字段名称是否一致。

如何解决

首先确认映射关系是否正确,如果是字段名称不匹配,那么修改字段名称使其匹配。如果是OGRLayer层字段不存在,那么需要确认OGRLayer层中的字段名称和数据文件中的字段名称是否一致。

此外可以使用 Field 参数来指定映射关系,这样可以避免映射关系配置错误。

如果还有问题,可以考虑检查代码中其他地方是否有错误,或者检查相关文件是否完整。如果问题依然存在,建议查看 django-import-export 官方文档或在相关社区中寻求帮助。

使用例子

假设你有一个模型 "MyModel" 和一个数据文件 "data.csv"。

在 MyModel 中定义了 name 和 age 两个字段,而在 "data.csv" 中有 name 和 birthday 两个字段。

如果你尝试使用 django-import-export 库将 "data.csv" 中的数据导入 MyModel,可能会出现 LayerMapError 错误。

解决方法是在Resource 中指定映射关系,比如:


class MyModelResource(resources.ModelResource):
    class Meta:
        model = MyModel
        fields = ('name', 'age',)
        import_id_fields = ('name',)
    def before_import(self, dataset, dry_run, **kwargs):
        new_header = []
        for h in dataset.headers:
            if h == "birthday":
                new_header.append("age")
            else:
                new_header.append(h)
        dataset.headers = new_header

这样就可以避免出现 LayerMapError 错误了

还有一种方法就是在视图函数或者表单验证中进行验证,在保存之前进行验证字段是否存在,并进行转换或者删除。

比如:


    def form_valid(self, form):
        data = form.cleaned_data
        if 'birthday' in data:
            data['age'] = calculate_age(data.pop('birthday'))
        form.cleaned_data = data
        return super().form_valid(form)

上面的例子中,如果birthday存在,则会将birthday字段删除并用计算年龄的函数转换成age字段,然后保存

总之可以有多种方式来解决LayerMapError,比如指定映射关系,在验证前删除或转换字段,以保证字段的正确性和一致性。