如何在django-import-export中用ProductModel标题替代ID导入数据?
用django-import-export通过外键标题导入数据的解决方案
要实现用ProductModel的标题替代ID导入Item数据,只需自定义ModelResource并使用ForeignKeyWidget指定匹配字段即可,步骤如下:
1. 定义自定义Resource类
先导入所需模块,然后为Item编写Resource类,重写外键字段的处理逻辑:
from import_export import resources, fields from import_export.widgets import ForeignKeyWidget from .models import Item, ProductModel class ItemResource(resources.ModelResource): # 重写model字段,指定通过ProductModel的title匹配 model = fields.Field( column_name='model_title', # 对应CSV里的列名,可根据你的CSV调整 attribute='model', widget=ForeignKeyWidget(ProductModel, field='title') ) class Meta: model = Item fields = ('title', 'model',) # 要导入的字段列表
2. 在Admin中注册Resource
修改admin.py,将自定义的Resource关联到Item的Admin类:
from django.contrib import admin from import_export.admin import ImportExportModelAdmin from .models import Item from .resources import ItemResource class ItemAdmin(ImportExportModelAdmin): resource_class = ItemResource admin.site.register(Item, ItemAdmin)
3. 注意事项
- 确保标题唯一:为避免导入时匹配到多个
ProductModel实例,建议给ProductModel的title字段添加唯一约束:class ProductModel(models.Model): title = models.CharField(max_length=100, unique=True) desc = models.TextField() - CSV列名对应:你的CSV文件中,对应外键的列名要和
column_name设置的一致(比如上面的model_title),列值填写ProductModel的标题即可。
内容的提问来源于stack exchange,提问作者Sesshōmaru
相关产品推荐
相关产品推荐

