基于ID字段创建或更新Django模型
问题描述:
我试图使用相同的表单来创建或更新Django模型。不幸的是,如果标识符是None
,其他答案中建议的update_or_create()
方法不起作用。目前,我正在检查id
是否为None
,获取ModelForm
,然后根据需要在单独的代码流中创建或更新对象。基于ID字段创建或更新Django模型
这里是我的代码:
# When the Conquest already exists
if c_id is not None:
# Check if Conquest is valid, else throw error
conq = get_object_or_404(Conquest,id=c_id)
# Verify ModelForm data based on existing instance
form = ConquestForm(request.POST,instance=conq)
if not form.is_valid():
print form.errors
return json_response(messages='Invalid form data')
conq.title=form.cleaned_data['title']
conq.description=form.cleaned_data['description']
conq.start_time=form.cleaned_data['start_time']
conq.end_time=form.cleaned_data['end_time']
conq.save()
return JsonResponse({'success':'true','message':'Conquest updated'},status=200)
else:
# Verify ModelForm data based
form = ConquestForm(request.POST)
if not form.is_valid():
print form.errors
return json_response(messages='Invalid form data')
conq = Conquest.objects.create(
title=form.cleaned_data['title'],
description=form.cleaned_data['description'],
start_time=form.cleaned_data['start_time'],
end_time=form.cleaned_data['end_time'])
return JsonResponse({'success':'true','message':'Conquest created'},status=200)
我怎样才能避免重复代码:
在创建与
form
对象/无指定instance
在具有独立代码创建和更新,而ID是
null
如果我没有指定instance=conq
,我会收到一个完整性错误,因为title
必须是唯一的。
答
首先需要了解几件事情。当您使用ModelForm
时,您不需要手动创建/更新实例。当您致电form.save()
时,您可以创建/更新。
如果您将None
提供给表单的实例参数,它实际上会将当前表单视为创建表单,否则将其作为参数instance
的对象上的更新表单处理。
如果您使用表单自动处理这些,您将不会有IntegrityError
,因为表单将无效,错误将在form.errors
中,您可以轻松地将其返回给客户端以进行通知。
这里的粗糙实现,它可能无法正常工作开箱即用,但至少应该足以引导你,你需要做什么:
def func(request, c_id):
if c_id:
conq = get_object_or_404(Conquest, id=c_id)
else:
conq = None
form = ConquestForm(request.POST or None, instance=conq)
if form.is_valid():
# this could either be a creation or an update
conquest = form.save()
return JsonResponse({'success': true})
else:
errors = form.errors
return JsonReponse({'success':false, 'errors': errors})
Django的文档约ModelForm。