python – 保存django中的对象列表
作者:互联网
我正在使用django 1.5,我正在尝试做这样的事情:
quotes = formset.save()
user = client_form.save()
for quote in quotes:
quote.client = user
quotes.save()
但是列表没有save()方法,所以有一些内置的功能可以做类似的事情吗?
我在SO Question about batch save objects in Django上发现了这个问题
django 1.5仍然是真的吗?
有没有办法避免对列表的每个对象进行save()调用?
这是我的实际视图代码:
def new_quote(request):
QuoteLineFormSet = modelformset_factory(QuoteLine, form=QuoteLineForm, extra=2)
if request.method == 'POST':
formset = QuoteLineFormSet(request.POST, request.FILES, queryset=QuoteLine.objects.none())
quote_form = QuoteForm(request.POST, request.FILES)
if formset.is_valid() and quote_form.is_valid():
quote_lines = formset.save(commit=False)
#quote_lines = formset.get_queryset()
quote = quote_form.save()
for quote_line in quote_lines:
quote_line.quote = quote
quote_line.save()
request.session['quote_id'] = quote.id
return HttpResponseRedirect(reverse('new_client'))
else:
formset = QuoteLineFormSet(queryset=QuoteLine.objects.none())
quote_form = QuoteForm()
return render(request, 'request_quote_form.html', {
'formset': formset,
'quote_form': quote_form,
})
我现在的解决方案
quote_line_ids = [item.pk for item in formset.save()]
quote_lines_qs = QuoteLine.objects.filter(pk__in=quote_line_ids)
quote = quote_form.save()
quote_lines_qs.update(quote=quote)
解决方法:
当你执行formset.save()时,它会像formset中的表单数一样多次访问数据库.因此,如果formset中的元素数是n,则它会命中.
因此,您可以在formset上使用commit = False,它根本不会命中db.然后,您可以更新对象并在每个对象上调用save().因此,您的数据库调用仍然是n次.
#doesn't hit the database at all
quotes = formset.save(commit=False)
user = client_form.save()
for quote in quotes:
quote.client = user
#hits the db
quote.save()
不确定是否可以在一次db调用中完成整个操作.
标签:python,django,django-views,django-orm,django-1-5 来源: https://codeday.me/bug/20190613/1229440.html