python-3.x - 如何在 django-import-export 中使用 ForeignKeywidget 解决 MultipleObjectsReturned
问题描述
我有一个资源可以帮助我将数据导入我的模型,但它不起作用。我已经尝试了所有我能做的选择,但没有成功。这是资源。
class ImportStudentsResource(resources.ModelResource):
klass = fields.Field(attribute = 'class',column_name='class',widget= ForeignKeyWidget(Klass,'name'))
stream = fields.Field(attribute = 'stream',column_name='stream',widget=ForeignKeyWidget(Stream,'name'))
gender = fields.Field(attribute = 'gender',column_name='gender', widget=ForeignKeyWidget(Gender, 'name'))
school = fields.Field(attribute = 'school',column_name='school', widget=ForeignKeyWidget(School, 'name'))
class Meta:
model = Students
fields = ('school','adm','name','kcpe','klass','stream','gender','notes')
import_id_fields = ('adm',)
import_order = ('school','adm','name','kcpe','klass','stream','gender','notes')
这是通过资源导入模型的数据
这是回溯。
Traceback (most recent call last):
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\views\generic\base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\views\generic\base.py", line 98, in dispatch
return handler(request, *args, **kwargs)
File "D:\Python\Django\Links Online Exams\Links_Online_Results\students\views.py", line 52, in post
result = resource.import_data(data_set, dry_run=True, collect_failed_rows=True, raise_errors=True)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\import_export\resources.py", line 741, in import_data
return self.import_data_inner(dataset, dry_run, raise_errors, using_transactions, collect_failed_rows, **kwargs)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\import_export\resources.py", line 788, in import_data_inner
raise row_result.errors[-1].error
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\import_export\resources.py", line 658, in import_row
self.import_obj(instance, row, dry_run)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\import_export\resources.py", line 512, in import_obj
self.import_field(field, obj, data)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\import_export\resources.py", line 495, in import_field
field.save(obj, data, is_m2m)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\import_export\fields.py", line 110, in save
cleaned = self.clean(data)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\import_export\fields.py", line 66, in clean
value = self.widget.clean(value, row=data)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\import_export\widgets.py", line 396, in clean
return self.get_queryset(value, row, *args, **kwargs).get(**{self.field: val})
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\query.py", line 433, in get
raise self.model.MultipleObjectsReturned(
students.models.Klass.MultipleObjectsReturned: get() returned more than one Klass -- it returned 2!
无值的可能原因
class StudentsForm(forms.ModelForm):
class Meta:
model = Students
fields = ("school","name","adm",'klass',"stream","kcpe","gender","notes")
widgets = {
'school':forms.TextInput(attrs={"class":'form-control','value':'','id':'identifier','type':'hidden'}),
'name':forms.TextInput(attrs={"class":'form-control'}),
}
def __init__(self, school, *args, **kwargs):
super(StudentsForm, self).__init__(*args, **kwargs)
self.fields['klass'] = forms.ModelChoiceField(
queryset=Klass.objects.filter(school=school),label='Class')
self.fields['stream'].queryset = Stream.objects.none()
if 'klass' in self.data:
try:
klass = int(self.data.get('klass'))
self.fields['stream'].queryset = Stream.objects.filter(klass_id=klass).order_by('name')
except (ValueError, TypeError):
pass # invalid input from the client; ignore and fallback to empty City queryset
elif self.instance.pk:
self.fields['stream'].queryset = self.instance.klass.stream_set.order_by('name')
解决方案
您违反了ForeignKey
类(klass)(以及流)行的约束
Jaq / class 2
Lucy / class 2
# only 1 can have 2 as its a ForeignKey
# same error will happen in stream row 4 Eagle 2 Hawk
你应该Foreignkey
使用一个ManyToMany
字段
文档:https ://docs.djangoproject.com/en/3.2/ref/models/fields/#manytomanyfield
推荐阅读
- c# - 如何在实体框架中添加仅由 Id 不同的实体(但让管理到 EF)?
- mysql - InnoDB:忽略空间 ID 为 26146 的数据文件“./catalog_category_product_index_store1.ibd”,因为重做日志引用
- python - 使用 Pycharm 执行不以关键字“test”开头的文件的 Pytest
- typescript - 使用 SuppressImplicitAnyIndexErrors = true 抑制 TypeScript 中的括号语法
- ruby-on-rails - Ruby on Rails - 参数化
- javascript - 如何使用来自另一个对等方的 WebRTC 连接添加视频流?
- python - python:具有可变函数名称的装饰器
- multithreading - 并行执行比顺序执行慢,即使代码“很重”
- python - 使用适当的 NaN 处理将熊猫数据框列从数字转换为字符串
- iphone - 如何在 iOS 模拟器上使用 appium 对 Google 移动应用程序进行自动化测试?