错误导入m2m小部件django import-export

时间:2018-02-23 13:09:33

标签: python django django-import-export

我正在使用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

1 个答案:

答案 0 :(得分:0)

问题是skip_unchanged = True。这看似不直观,但应显示为skip_unchanged = False

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

在您的情况下,Django数据库中将包含以下表:

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

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