【问题标题】:Import M2M Empty values imported导入 M2M 导入的空值
【发布时间】:2020-11-17 14:35:46
【问题描述】:

Using Widget Many to many 导入时结果为空。 标签确实存在于原始模型中。

查看图片。

import result

Excel 导入

| provider  | tag             | provider_tag_id |
|-----------|-----------------|-----------------|
| Lionsgate | Planes, Top     |                 |
| FOX       | Houses, Low     |                 |
| Dorcel    | something, else |                 |

m2m 指向的模型

class Tag(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=250, unique=True)

    def __str__(self):
        return self.name

m2m关系所在的模型

class ProviderTag(models.Model):
    provider_tag_id = models.AutoField(primary_key=True)
    provider = models.ForeignKey(Provider, on_delete=models.DO_NOTHING)
    tags = models.ManyToManyField(Tag)

要导入的资源

class ProviderTagResource(resources.ModelResource):

provider = fields.Field(
    column_name='provider',
    attribute='provider',
    widget=ForeignKeyWidget(Provider, 'name')
)
tags = fields.Field(
    column_name='tags',
    attribute='tags',
    widget=ManyToManyWidget(Tag, separator=',', field='name')
)

class Meta():
    model = ProviderTag
    fields = ('provider', 'tags', 'provider_tag_id',)
    import_id_fields = ('provider_tag_id',)

Admin.py

 class ProviderTagAdmin(ImportExportModelAdmin):
    list_display = ('provider', 'get_tags', 'provider_tag_id')
    search_fields = ['provider',]
    resource_class = ProviderTagResource

    def get_tags(self, obj):
        print(obj.tags)
        return ", ".join([str(p) for p in obj.tags.all()])
admin.site.register(ProviderTag, ProviderTagAdmin)

【问题讨论】:

    标签: django django-models django-admin django-import-export django-admin-tools


    【解决方案1】:

    我无法提供直接答案,但我的建议是让 example application 运行。

    您可以轻松地测试导入 m2m 字段。您必须在 core/admin.py 文件中的 BookResource 上定义一个 m2m 字段:

    class BookResource(ModelResource):
        categories = fields.Field(
            attribute='categories',
            widget=widgets.ManyToManyWidget(Category, field='name',
                                            separator='|')
        )
    
        class Meta:
            model = Book
    

    然后你可以导入一个示例文件,例如:

    id,name,author,author_email,imported,published,published_time,price,categories
    1,book1,,email@example.com,0,2020-07-21,,10.25,Category1|Category2
    

    至少如果你能证明它在示例应用程序中工作,那么你可以有希望尝试调试你的实现。

    【讨论】:

    • 我会试试的。让我们看看我是否发现缺少什么。
    • 好的。问题是,当我从命令行创建 CSV 时,这是有效的。 (就像您分享的一样)当我使用 Excel 时出现错误。
    • 好的。更多信息在这里...导入导出测试应用程序有同样的问题。 :(
    • 使用上面的例子对我来说效果很好(包括 xlsx 文件)
    • 使用 excel 对我不起作用。我认为是与区域配置有关的东西。就像 Windows 控制面板上的列表分隔符。我在西班牙有。我找到了解决“我的”用户的方法。使用 Google Drive Spreadhseet,然后将其下载为 xsl 它可以工作...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多