python 使用import_export django库导入个性化导出CSV

ryevplcw  于 2023-02-07  发布在  Python
关注(0)|答案(1)|浏览(227)

我在我的应用程序中有两个操作。首先,我使用特定资源(见下文)将数据导出到CSV,以具有个性化的标题和特定外键的名称,而不是ID。导出CSV文件是可以的。修改后导入...出现错误:完整性错误:(1048,“列”产品标识“不能为空”)
下面是Greffons的资源类,用于获取特定的列名称并对 meta中的列进行排序。

class GreffonResource(resources.ModelResource):
    comm = fields.Field(
        column_name='Pre-Commandes',
        attribute='comm',
    )
    greffons = fields.Field(
        column_name='Greffons',
        attribute='greffons',
    )
    objectif = fields.Field(
        column_name='Objectifs',
        attribute='objectif',
    )
    realise = fields.Field(
        column_name='Realises',
        attribute='realise',
    )
    reussi = fields.Field(
        column_name='Reussis',
        attribute='reussi',
    )
    variete = fields.Field(
        column_name='Variete',
        attribute='produit__variete',
        widget=widgets.ForeignKeyWidget(Produit, 'nom')
    )
    espece = fields.Field(
        column_name='Espece',
        attribute='produit__espece',
        widget=widgets.ForeignKeyWidget(Produit, 'nom')
    )
    portegreffe = fields.Field(
        column_name='Porte Greffe',
        attribute='produit__portegreffe',
        widget=widgets.ForeignKeyWidget(Produit, 'nom')
    )
    produit = fields.Field(
        column_name='Produits',
        attribute='produit',
        widget=widgets.ForeignKeyWidget(Produit, 'id')
    )
    rang = fields.Field(
        column_name='Rangs',
        attribute='rang',
    )
    class Meta:
        model = Greffons
        fields = ('id', 'produit', 'variete', 'espece', portegreffe', 'comm', 'greffons', 'objectif', 'realise', 'reussi', 'rang')
        export_order = ['id', 'produit', 'variete', 'espece', portegreffe', 'comm', 'greffons', 'objectif', 'realise', 'reussi', 'rang']
        import_id_fields = ('id', 'produit')

导出CSV文件后,我改变了里面的数据,但错误后导入它:(下面是POST后导入数据的代码。

produit_resource = GreffonResource()
dataset = Dataset()
new_datas = request.FILES['myfile']
imported_data = dataset.load(new_datas.read().decode(), format='csv')
if categorie == "GREFFONS":
result = produit_resource.import_data(imported_data, dry_run=True, raise_errors=True)

[EDIT]:最后,该问题是由于编辑器应用程序在文件结尾后添加了一些空行......
我编辑了我的资源类,以添加一些与产品相关的其他字段......对于导出是可以的,但是当我导入它们时......我得到了两个新错误,这取决于我是否让“produit”进入import_id_fields......
不存在于/produits/import_xls/ Produit匹配查询不存在。

在/produits/import_xls/ get()返回的多个对象返回了多个Greffons --它返回了2个!
我检查了,我的列包含唯一ID...
最后,我只需要导出带有ID和其他外键文本值(名称)的文件+从产品ID再次导入...请再次帮助^^

5f0d552i

5f0d552i1#

很可能是csv中的Produits.nom值未Map到单个现有Produit示例。这将导致创建空值失败。
您需要查看导入文件并检查“产品”列的所有值。确保其中的任何值都可以Map到Produit表中的nom条目。是否可能是因为“nom”存在空值,而这些值被解释为NULL?
该行声明名为“产品”的csv列将具有Map到Produit.nom的值:

produit = fields.Field(
    column_name='Produits',
    attribute='produit',
    widget=widgets.ForeignKeyWidget(Produit, 'nom')
)

如果您找不到问题的根源,最好的办法是使用调试器逐步执行导入,这样您应该可以确切地看到问题所在。

相关问题