gpt4 book ai didi

python - django save()方法保存manytomany字段为什么我们需要save_m2m()

转载 作者:行者123 更新时间:2023-12-01 05:27:18 25 4
gpt4 key购买 nike

我已引用此文档页面的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com