2016-01-06 104 views
2

我寫了一個小應用程序,允許用戶創建自己的Excel報告。我的其中一個查詢將列表解壓到.values()以返回列。我遇到的問題是試圖迭代/引用返回的值,因爲我不知道報告中包含哪些值。迭代查詢集值

這裏是我的嘗試:

queryset = Claim.objects.filter(client=client, creation__year=year, creation__month=month)\ 
      .values(*values).order_by('id') 

for i, c in enumerate(queryset): 
    for ii, r in enumerate(c): 
     print c 

我得到

TypeError: 'Claim' object is not iterable 
+1

您確定這是您正在運行的確切代碼嗎?當你使用'values()'你迭代一個字典的查詢集時,所以你不應該得到''Claim'對象不可迭代'。請顯示完整的回溯。例如, – Alasdair

回答

2

的問題是,你的5號線for ii, r in enumerate(c):無法枚舉一個Model類型。

您可以在第一次循環時退出。 (我不明白爲什麼第二個循環是有..)

for i, c in enumerate(queryset): 
    print i, c, type(c) 

,你會得到這樣的:

0 {[some dict data]} <dict> 
1 {[some dict data]} <dict> 
2 {[some dict data]} <dict> 
3 {[some dict data]} <dict> 
.... 
+0

。在第一個循環中,我遍歷查詢集,以便可以訪問'c.first_name'並獲取'first_name'值。由於用戶在.values()中傳入了自己的值,我不能通過'c.firstname'來引用。我正在努力想出另一種方式來引用它們,無論是通過索引或迭代 – Mantis

+1

@Mantis哦,我看到你的問題,values()將它變成一個'dict',你將無法做'c.first_name' ,你將不得不做'c ['first_name']'或'c.get('first_name')' - 但仍然是一個循環。 –

+0

對不起。我不認爲我的問題非常清楚。儘管用說法()把它變成了一個字典,你確實慢跑了我的記憶。它是values_list()我需要的,所以我可以'c [0]'例如 – Mantis

0

感謝哈維爾·布茲我能實現我的錯誤。我需要values_list()而不是values()。

queryset = Claim.objects.filter(client=client, creation__year=year, creation__month=month)\ 
      .values_list(*values).order_by('id') 

for i, c in enumerate(queryset): 
     print q[i] 
+0

只是很高興你得到它;) –