首页 > 解决方案 > django-import-export:导入多对多字段

问题描述

我有一个模型“网站”,它可以有多个类别:

模型.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 文件为每个网站导入多个逗号分隔的类别。
以下是我的管理文件:

管理员.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".

这可能是因为当一个条目保存在具有特定主键(本例中为 uuid)的桥表(website_category)中时,该 PK 不存在于网站表中,因此外键约束失败。

对此提出的任何解决方案都将受到高度赞赏。

谢谢

标签: pythondjangodjango-modelsdjango-admindjango-import-export

解决方案


推荐阅读