【问题标题】:Error import m2m widget django import-export错误导入 m2m 小部件 django import-export
【发布时间】:2018-02-23 13:09:32
【问题描述】:

我正在使用 django-import-export Django 库,但它不适用于 m2m 关系。

我有以下 models.py

class Writer(models.Model):
    name = models.CharField(verbose_name='Nome', max_length=20)
    last_name = models.CharField(verbose_name='Sobrenome', max_length=50, default='')

    def __str__(self):
        return '%s (%s)' % (self.last_name,self.name)


class Book(models.Model):

    book = models.CharField(verbose_name='Título', max_length=200)
    isbn = models.CharField(verbose_name='ISBN:',max_length=13,help_text='13 Caracteres')
    writer = models.ManyToManyField('Writer', verbose_name='Escritor(es)')

    def __str__(self):
        return self.book

    # Cria uma string a partir dos 3 primeiros nomes de autores (se existe)
    def display_writer(self):
        """
        Creates a string for the Genre. This is required to display genre in Admin.
        """
        return ', '.join([ writer.name for writer in self.writer.all()[:3] ])
    display_writer.short_description = 'Writer'

O arquivo de resources.py

from import_export import resources
from import_export.fields import Field
from import_export.widgets import ManyToManyWidget
from .models import Book, Writer

class BookResource(resources.ModelResource):

    writer = Field(column_name='writer', attribute='writer', widget=ManyToManyWidget(Writer,separator=',', field='name'))

    class Meta:
        model = Book
        skip_unchanged = True 
        report_skipped = False
        import_id_fields = ( 'isbn' ,) 
        fields = ('isbn', 'book', 'writer', )

导入csv文件时不报错,但m2m字段的数据无所谓。

遵循 csv 文件中的数据示例。

enter image description here

【问题讨论】:

  • csv 数据是什么样的?
  • 原因可能是因为您将skip_unchanged 设置为true。您可以尝试更改数据或将标志设置为 false。
  • @HåkenLid,包含 csv 数据图像。
  • @Sagar 我进行了测试,将其配置为 false,但在没有来自“writer”字段的数据的情况下继续导入。
  • 你有没有让这个工作?

标签: python django django-import-export


【解决方案1】:

问题是skip_unchanged = True。这可能看起来不直观,但它应该是skip_unchanged = False

要了解其原因,您需要考虑 Django 维护的数据。 skip_unchanged 表示在对模型表未进行任何更改时跳过行导入。当您更改 M2M 关系时,模型表不会更改。相反,关系表会发生变化。

在您的情况下,您将在 Django 数据库中拥有以下表格:

  • <app>_writer - 所有作者。
  • <app>_book - 所有的书。
  • <app>_book_writer - 将书籍与其作者联系起来的多对多关系。

当您导入现有图书并仅更改 writer 时,唯一要更新的表是 <app>_book_writer。由于某种原因,导入/导出插件不认为这是对 book 模型的更改,因此跳过它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2022-01-18
    • 2022-08-04
    相关资源
    最近更新 更多