2011-07-05 129 views
0

我想要做的是編寫一個查詢集,過濾出獨特的父/名組合。我只對第一次出現一個獨特的父母名稱感興趣。Django過濾一個查詢集 -

ID PARENT TYPE  LIBTYPE NAME 
1  1  project  1  book_a 
4  4  project  2  book_b 
5  4  project  2  book_c 
6  4  project  2  book_d 
7  4  project  4  book_c 
8  5  project  2  book_e 
9  5  project  4  book_e 
10  7  project  0  book_f 
11  7  project  0  book_g 
12  7  project  6  book_h 
13  6  user  1  book_i 
14  6  project  1  book_j 
15  6  project  1  book_k 
16  7  project  5  book_h 
17  7  project  8  book_h 
18  7  project  7  book_h 
19  7  project  9  book_h 
20  7  project  1  book_h 
21  8  project  1  book_a 

所以我們開始一個基本的查詢集..

vars = Variants.objects.filter(type="project") 

這移出孤獨的用戶。現在在純Python我只想做這個篩選這個傻逼。

vars = Variants.objects.filter(type="project") 
new_vars = [] 
for idx, var in vars.enumerate(): 
    if var.name not in new_vars: 
     new_vars.append((var.parent,var.name)) 
    else: 
     del vars[idx] 

我到底應該結束了,下面的ID(1,4,5,6,8,10,11,13,14,15,21)很顯然,我不能在查詢集枚舉再加上我相信有一種方法可以在Django中進行過濾。

有人可以請講解如何有效地在Django中做到這一點?

+1

一個不相關的小竅門:我會避免使用'vars'作爲變量/函數名稱,因爲它會覆蓋內置函數。見http://docs.python.org/library/functions.html –

回答

1

恐怕你的所謂「純Python」解決方案毫無意義。首先,enumerate是一個內置的,所以你可以打電話enumerate(vars);其次,你添加一個元組到new_vars,所以var in new_vars永遠不會是真的;第三,我看不到你用這個del聲明要做什麼 - 你不應該修改你正在迭代的東西。

Python中的更好的解決方案可能是這樣的:

var_dict = {} 
for var in vars: 
    if var.name not in var_dict: 
     var_dict[var.name] = var 

return var_dict.values() 

與一個queryset的作品一樣好。

但是,如果我理解正確,那麼您是在使用db級解決方案。這是不可能的,因爲聚合函數在被選擇的整個行上工作。您可以獲得(parent, name)的唯一值,但您無法獲得該ID - 因爲(id, parent, name)不是唯一的組合。

+0

睡得太少 - 我很尷尬。我感謝你浪費你的時間來展示我 - 我也意識到了嚴重的錯誤。接受和關閉。謝謝丹! FWIW--唯一性是基於名字和父母,而不僅僅是名字。無論我不再需要幫助 - 我也不配。 – rh0dium

+0

不要對自己這麼辛苦!這個論壇是爲了提出問題,而這遠遠不是一個壞問題或者你沒有努力。 –

0

這是我沒做 - 丹是正確的,我是一個骨頭..

projects = Variant.objects.filter(type="project") 
filter_list, uniq_projs = [], [] 
for project in projects: 
    if (project.name, project.parent) not in uniq_projs: 
     uniq_projs.append((project.name, project.parent)) 
     filter_list.append(project.id) 
projects = Variant.objects.filter(type="project", id__in=filter_list).order_by('parent__name') 

感覺如此愚蠢..