我已引用此文档页面的 save() 方法 https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method
但在我看来,我有以下代码
def saveEvent(request):
eventForm = EventForm(request.POST)
if eventForm.is_valid():
event=eventForm.save(commit=False)
requestor=None
if(event.is_hp_requestor):
#Save and get requestor
requestorHPPersonForm = PersonHiddenForm(request.POST, prefix = 'hp_requestor')
requestorHPEmployeeForm = HPEmployeeForm(request.POST, prefix = 'hp_requestor')
requestor=saveHPEmployeeHelper(requestorHPEmployeeForm, requestorHPPersonForm).person
else:
requestorHPPersonForm = PersonHiddenForm(request.POST, prefix = 'hp_requestor')
requestor=get_object_or_404(Person, pk=requestorHPPersonForm.data[requestorHPPersonForm.prefix+'-'+'email'])
if (requestor is not None) and eventForm.is_valid():
event.requestor_new=requestor
event.save()
if request.POST['opportunities']:
for str_sfid in request.POST['opportunities'].split(','):
sfid = int(str_sfid)
opportunity_object, dummy = Opportunity.objects.get_or_create(sfdc_id=sfid)
event.opportunities.add(opportunity_object)
event.save()
return HttpResponseRedirect(reverse('dashboard'))
else:
errors = eventForm.errors
return HttpResponse(json.dumps(errors), status=500, mimetype='application/json')
在我看来,我没有调用 save_m2m() 方法,但它仍然保存了 Many2many 字段数据。 它是如何工作的,如果有效那么为什么我们需要 save_m2m() 方法?
最佳答案
您链接来解释这一点的文档:
Calling save_m2m() is only required if you use save(commit=False). When you use a simple save() on a form, all data – including many-to-many data – is saved without the need for any additional method calls.
此外,看起来 event
本身就是一个模型实例而不是表单。表单需要 save_m2m
,而不是模型实例。
解释一下文档中的解释:如果使用 commit=True
(默认)调用表单的 save
方法,它会执行两件事 - 它会创建一个新的模型实例使用表单的清理数据,并将该模型实例写入数据库。然后,如果存在任何多对多关系,它也会将这些关系写入数据库。它在写入实例后执行此操作,因为在实例具有主键之前无法写入多对多关系,主键是在将其写入数据库时自动生成的。
如果您使用 commit=False
调用表单的 save
方法,它会创建新的模型实例,但不会将其写入数据库。因此,它还没有主键,也无法保存多对多信息。保存模型实例并为其生成主键后,多对多信息仍然仅存储在表单对象中。因此,您需要通过调用 save_m2m
通知表单对象现在可以保存多对多信息。
编辑由于您添加了更多代码,我可以更清楚地看到您所要求的内容。上面的代码不会保存在 EventForm
实例中设置的多对多关系。这就是你设置机会的循环正在做的事情吗?
关于python - django save()方法保存manytomany字段为什么我们需要save_m2m(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21068050/