我正在使用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文件中的数据示例。
答案 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
模型的更改,因此可以跳过。