我目前在我的项目中使用模型表单集。
我发现的问题是,该应用程序可能必须在同一页面上显示50多个表单,因此使用.save()
方法保存它们会产生50多个查询(对于我保存)。
由于所有表单都具有相同的结构,因此理想的情况是能够使用bulk_create
保存它们,从而只生成一个查询,但是modelformset不支持bulk_create
有什么方法可以仅通过一个查询来保存表格的所有答案?
我唯一想到的是,在使用formset.is_valid()
验证表单之后,恢复request.POST
,然后从其中保存bulk_create
。
还有更好的选择吗?
答案 0 :(得分:0)
我认为您非常接近解决方案(但是您也可以使用form.cleaned_data,而不是QueryDict)。现在,我将向您展示我的实现(使用了bulk_create()queryset方法。这将有助于我们避免对数据库的很多匹配)
class MyForm(forms.Form):
''' use same names for fields as you have in models.py '''
name = forms.CharField()
surname = forms.CharField()
class Person(models.Model):
name = models.CharField(max_length=55)
surname = models.CharField(max_length=55)
class Meta:
db_table = 'person'
from django.shortcuts import render
from django.http import JsonResponse
from django.forms import formset_factory
from django.db import connection
from .models import Person
from .forms import MyForm
N = 3 # number of forms
def index(request):
FormSet = formset_factory(MyForm, extra=N)
if request.method == 'POST':
fs = FormSet(data=request.POST)
if fs.is_valid():
data_for_bulk = [Person(**field_dict) for field_dict in fs.cleaned_data] # this returns list and pass to bulk_create() method.
Person.objects.bulk_create(data_for_bulk)
# use connection.queries to make monitoring of sql queries during HTTP POST request.
for query in connection.queries:
print(query['sql'], '\n')
return JsonResponse({'status_message': 'OK'})
else:
fs = FormSet()
return render(request, 'test.html', {'form': fs})
我希望,我的解决方案能够为您提供帮助。祝你好运!