2014-11-24 59 views
1

我有動作代碼爲我的ModelAdmin返回2個CSV文件內容如下:Django的查詢集的迭代器不返回記錄行動

def export_csv(modeladmin, request, queryset): 

    queryset_f1 = queryset 
    response_f1 = export_f1(modeladmin, request, queryset_f1) 

    queryset_f2 = queryset 
    response_f2 = export_f2(modeladmin, request, queryset_f2) 

    return (response_f1,response_f2) 

因爲我需要同樣的查詢集對象,每次處理,我用了迭代器如下:

def export_csv(modeladmin, request, queryset): 

    queryset_f1 = queryset.iterator() 
    response_f1 = export_f1(modeladmin, request, queryset_f1) 

    queryset_f2 = queryset.iterator() 
    response_f2 = export_f2(modeladmin, request, queryset_f2) 

    return (response_f1,response_f2) 

現在程序不會在2個CSV中輸出任何結果。爲什麼這樣?我正在操作export_f1方法中的一些對象,我不想在方法export_f2中更改它,因此我正在使用iterator()。如果我不使用迭代器()分別調用2個方法,它們會以CSV格式返回數據。我想在模型admin中使用此操作方法同時返回2個CSV文件。我怎樣才能做到這一點?使用Django 1.6.5

回答

-1

def export_f1(modeladmin, request, queryset): 
    for obj in queryset.iterator(): 
     pass 

同樣,對於export_f2,修改了上面的EXPORT_CSV代碼通過從它刪除迭代器調用讀取爲:

def export_csv(modeladmin, request, queryset): 

    queryset_f1 = queryset 
    response_f1 = export_f1(modeladmin, request, queryset_f1) 

    queryset_f2 = queryset 
    response_f2 = export_f2(modeladmin, request, queryset_f2) 

    return (response_f1,response_f2) 
1

你應該表現出的一些代碼,您export_f1export_f2,因爲當你使用iterator()你有幾乎一樣在查詢集有一些不同。

  • iterator()不緩存查詢,如果你重複100次,Django會執行它的100倍
  • iterator()好,當你有一個非常大的查詢集,只需要它的
  • 幾個對象使用迭代器,你必須仔細,因爲它可以操作

後是空的要訪問iterator()要素是不一樣的一個QuerySet,你可以用不同的方式訪問秒。一個簡單的方法來從.iterator()的完整列表是:

list(queryset.iterator()) 

如果你有queryset.iterator()一個名爲iter變量中,你做list(iter),該指令後iter將是空

你也可以使用.next()一個接一個地訪問對象:

# Let's supose you have your iterator in queryset.iterator() 
iter = queryset.iterator() 
iter.next() # return first element 
iter.next() # return second element 
# After the last element, if you do again iter.next() youll get an exception 

如果你queryset.iterator().next()返回永諾的第一元素

但所有這一切取決於你的功能export_fiexport_f2,以及如何您使用的查詢集/迭代器。如果你表現出你的函數一些代碼也許我們可以找到通過調用迭代器的方法定義,而不是調用方法EXPORT_CSV解決了這個問題