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

标签 python django

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

相关文章:

python - C++ 中是否有 Python API 函数可以通过名称获取值?

python - 从子进程运行的子进程的乱序输出

python - 如何将这两个图像与 python numpy 和 opencv 合并?

django - 如果您只发送 JSON 对象,那么合适的 NGINX 配置是什么?

Python:如何创建二元组序列

python - ply lexmatch 正则表达式与通常的 re 具有不同的组

python - 从根据下拉菜单变化的数据表中抓取 'li' 标签

Django-Celery - 从管理页面重新提交任务?

具有多个相同的 Django OneToOneField --related_name

python - 根据请求动态选择数据库