【发布时间】:2009-12-03 07:23:10
【问题描述】:
我有几个具有多对多关系的简单对象。 Django 使用 obj1_obj2 表加入了它们,它在 mysql 中看起来像这样;
id | person_id | nationality_id
-----------------------------------
1 | 1 | 1
2 | 1 | 2
现在,当我保存 obj1(它以多选形式显示 obj2)时,即使我没有更改它们,obj1_obj2 表中的 id 也会增加。例如,我在其表单上更改了 obj1 的基本字符字段并将其保存,连接表中的数据似乎已被删除并重新保存,从而为条目提供了新的 id。
事实上,我不需要更改任何内容,只需保存表单,同样的事情就会发生。
我在视图中所做的只是 form.save(),没什么特别的。这是正常的工作方式吗?
编辑:添加模型、视图、表单
class Person(models.Model):
name = models.CharField()
birthdate = models.CharField()
nationality = models.ManyToMany(Nationality)
class Employee(Person):
employeeNum = models.CharField()
class FamilyMember(Person):
employee = models.ForeignKey(Employee)
relationship = models.CharField()
class Nationality(models.Model):
abbrev = models.CharField()
country = models.CharField()
class FamilyMemberDetailsForm(forms.ModelForm):
class Meta:
model = FamilyMemeber
exclude = ['employee']
def editFamilyMember(request, familyMember_id):
familyMember = get_object_404(FamilMember, familyMember_id)
if request.method == 'POST':
form = FamilyMemberDetailsForm(request.POST, instance=familyMember)
if form.is_valid():
form.save()
else:
form = FamilyMemberDetailsForm(instance=familyMember)
return render_to_response(editForm.html, {'form':form},
context_instance(RequestContext(request))
这是模型的精简版,但同样的情况也适用于保存员工或家庭成员。我展示了 FamilyMember,因为它就像这样简单,我创建了 modelForm,然后进行更改,然后保存它。对于员工,我在国籍表格的 init 中进行了更多操作,主要是为了演示,起初我认为是这种操作导致了它,但正如我所说的,同样的事情发生了与 FamilyMember 一起,除了保存之外我什么都不做。
国籍在表单上显示为带有列表的多选框,用户可以从列表中选择一个或多个。如果我只是呈现填充的表单然后保存它而不更改任何内容,那么多对多表条目的 id 会更改。
我也更改了示例表标题。
谢谢,
安德鲁
【问题讨论】:
-
obj1_obj2 表是否真的将两个 id 都设置为 1 还是只是一个错字?
-
请显示您的视图代码。
-
我支持代码请求...我认为我的 m2m 关系不会受到这种影响
-
id 都是一个是错字。
-
我已经为视图、模型(缩减)和模型表单添加了代码。
标签: django save many-to-many