有什么方法可以将bulk_create与模型表单集一起使用?

时间:2019-05-21 18:03:07

标签: django django-forms

我目前在我的项目中使用模型表单集。

我发现的问题是,该应用程序可能必须在同一页面上显示50多个表单,因此使用.save()方法保存它们会产生50多个查询(对于我保存)。

由于所有表单都具有相同的结构,因此理想的情况是能够使用bulk_create保存它们,从而只生成一个查询,但是modelformset不支持bulk_create

有什么方法可以仅通过一个查询来保存表格的所有答案?

我唯一想到的是,在使用formset.is_valid()验证表单之后,恢复request.POST,然后从其中保存bulk_create

还有更好的选择吗?

1 个答案:

答案 0 :(得分:0)

我认为您非常接近解决方案(但是您也可以使用form.cleaned_data,而不是QueryDict)。现在,我将向您展示我的实现(使用了bulk_create()queryset方法。这将有助于我们避免对数据库的很多匹配

forms.py

class MyForm(forms.Form):
    ''' use same names for fields as you have in models.py '''
    name = forms.CharField()
    surname = forms.CharField()

models.py

class Person(models.Model):
        name = models.CharField(max_length=55)
        surname = models.CharField(max_length=55)

        class Meta:
            db_table = 'person'

views.py

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})

我希望,我的解决方案能够为您提供帮助。祝你好运!