python - 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 不存在于网站表中,因此外键约束失败。
对此提出的任何解决方案都将受到高度赞赏。
谢谢
解决方案
推荐阅读
- vue.js - 在 vue 中自动播放音频:如何在浏览器上加载页面时使其自动播放,现在我正在双重刷新页面以使其自动播放
- html - HTML中的嵌套colspan
- reactjs - 更新“UseContext 数组”无法重新渲染/生成新组件
- php - laravel 获取仅通过电子邮件验证的用户列表
- hyperledger-fabric - 使用 softHSM:为什么我的订购者仍在 Orderer.General.TLS.Privatekey 路径上寻找私钥?
- python - 无法在python中清理csv文件
- reactjs - TypeError:无法读取未定义反应本机抽屉的属性“导航”
- wpf - 在不同的地方设置 TabItem 标题
- elasticsearch - 将数据从原始 Elasticsearch 索引移动到另一个具有更多分片数或增加现有索引中的分片数的索引
- c# - 将 char* C 函数编组为 C#