django - Django模型形式:m2m的反面不保存
问题描述
从 Django 1.8 (python 2.7) 升级到 Django 2.0 (python 3.6) 后,此表单和反向 m2m 小部件出现错误:
models.py
class Treatment(Model):
...
class Specialty(Model):
treatment = models.ManyToManyField(Treatment, related_name='specialties', blank=True)
...
. 这是治疗模型的表格。它还允许编辑专业(反向 m2m)。在升级之前它运行良好。
forms.py
class TreatDetail(forms.ModelForm):
specialties = forms.ModelMultipleChoiceField(
queryset=Specialty.objects.all().order_by('specialty_de'),
required=False,
widget=FilteredSelectMultiple('Specialties', False),
)
def save(self, commit=True):
treatment = super(TreatDetail, self).save(commit=False)
if commit:
treatment.save()
if treatment.pk:
treatment.specialties = self.cleaned_data['specialties']
self.save_m2m()
return treatment
def __init__(self, *args, **kwargs):
super(TreatDetail, self).__init__(*args, **kwargs)
if self.instance and self.instance.pk:
self.fields['specialties'].initial = self.instance.specialties.all()
class Meta:
model = Treatment
fields = (
'top_treatment',
'treatment_de',
....)
我得到这个错误:
/customadmin/treatdetail/2/de/ 处的 TypeError 禁止直接分配到多对多集合的反面。请改用 specialties.set()。
treatment.specialties = self.cleaned_data['specialties']
当然我试过:
treatment.specialties.set = self.cleaned_data['specialties']
错误消失,但未保存反向 m2m 关系。
有人可以帮忙吗?
解决方案
你做错了。您必须像这样M2M
在 Django 2.0中将项目添加到关系中:
如果是一个专业列表- 您必须遍历它们并以相同的方式一个接一个地添加到您的.
treatment.specialties.add(self.cleaned_data['specialties'])
self.cleaned_data['specialties']
treatment.specialties
推荐阅读
- arrays - 在 VB.NET 和 Newtonsoft 中使用嵌套数组反序列化集合
- python - 如何保存标题信息,但删除顶行以迭代(Pandas Dataframe)?
- shell - 不能使用从源文件路径中的 $0 中提取的变量
- oracle - 使用 PowerShell 连接 Oracle 11g
- postgresql - 如何在 PostgreSQL 中更改一周的开始时间
- java - 选择不同的 Spinner 项目时应用程序崩溃
- javascript - 如何返回列表中同一对象的计数?
- amazon-redshift - Redshift - Split_Part 和最小值
- python-3.x - 尝试从脚本运行scrapy时出现“ImportError”
- c - C:通过绝对值函数传递数组