2013-04-17 87 views
4

我使用Django 1.5和我試圖做這樣的事情的對象的列表:保存在Django

quotes = formset.save() 
    user = client_form.save() 
    for quote in quotes: 
     quote.client = user 
    quotes.save() 

但名單沒有一個保存()方法,因此有一些內置的功能做相似的東西 ?

我發現SO Question about batch save objects in Django

這nswer這還算是真正的和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) 

回答

2

當你做formset.save(),它擊中數據庫多次在表單集的形式編號。因此,如果formset中的元素數量爲n,那麼它的n命中。

因此,你可以在formset上有commit=False,它根本不會碰到數據庫。然後,您可以更新對象並在每個對象上調用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中完成整個操作。

+0

真實https://github.com/django/django/blob/master/django/forms/models的.py – maazza

0

也有看看這個link。非常簡單易用的方法。從博客:

for x in seq: 
    o = SomeObject() 
    o.foo = x 
    o.save() 

成爲

l = [] 
for x in seq: 
    o = SomeObject() 
    o.foo = x 
    l.append(o) 
insert_many(l) 
+0

我想避免一些第三方代碼,如果有可能 – maazza