Django-import-export: Импорт поля "многие ко многим
У меня есть модель "Веб-сайт", которая может иметь несколько категорий:
Model.py
class Website(models.Model):
...
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
category = models.ManyToManyField('Category', related_name='website_category')
country = models.ForeignKey('Country', null=True, blank=False, on_delete=models.SET_NULL, related_name='website_country')
language = models.ForeignKey('Language', null=True, blank=False, on_delete=models.SET_NULL, related_name='website_language')
...
Я готов импортировать несколько категорий, разделенных запятыми, для каждого сайта через xlsx файл.
Ниже приведен мой файл администратора:
Admin.py
class WebsiteResource(resources.ModelResource):
category = fields.Field(
column_name='category',
attribute='category',
widget=ManyToManyWidget(Category, ',', 'name'))
country = fields.Field(
column_name='country',
attribute='country',
widget=ForeignKeyWidget(Country, 'name'))
language = fields.Field(
column_name='language',
attribute='language',
widget=ForeignKeyWidget(Language, 'name'))
def before_import_row(self, row, row_number=None, **kwargs):
try:
row['uuid'] = uuid.uuid4()
row['cost_price'] = row['publication_price'] * (row['percentage']/100)
row['url'] = clear_url(row['url'])
row['outreached_by'] = get_outreached_by_details(kwargs['user'])
except Exception as e:
raise ValidationError(e)
class Meta:
model = Website
import_id_fields = ['uuid']
fields = (....)
class WebsiteAdmin(ImportMixin, admin.ModelAdmin):
resource_class = WebsiteResource
....
def get_import_formats(self):
formats = (
# base_formats.CSV,
base_formats.XLSX,
)
return [f for f in formats if f().can_export()]
class meta:
model = Website
Все остальное работает нормально, но поскольку это поле категории является полем "многие ко многим", у меня возникает исключение при подтверждении импорта.
Исключение:
insert or update on table "GPFY_website_category" violates foreign key constraint "GPFY_website_category_website_id_32320ddd_fk_GPFY_website_uuid"
DETAIL: Key (website_id)=(3ed6ae85-d309-4e7f-b2d9-5a74ddeb3b90) is not present in table "GPFY_website".
Возможно, это происходит потому, что когда запись сохраняется в таблице bridge (website_category) с определенным первичным ключом (uuid в данном случае), этого PK нет в таблице website, и поэтому ограничение внешнего ключа не работает.
Любое предложенное решение для этого будет высоко оценено.
Спасибо