2011-07-05 10 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 

だから我々は今、純粋なPythonで、私はちょうどこの吸盤をフィルタリングするためにこれを行うだろう。これが唯一のユーザーを削除...基本的なクエリセットで

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

を開始しました。私は、以下のIDの(1,4,5,6,8,10,11,13,14,15,21)で終わる必要があります最終的には

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] 

もちろん、私は、クエリセットに列挙することはできません私はDjangoでこれをフィルタリングする方法があると確信しています。

誰かがDjangoでこれを効率的に行う方法についていくつかの光を当てることができますか?

+1

無関係な小さなヒント:私は 'vars'を使用して避けるだろうそれは組み込み関数をオーバーライドするので、変数/関数名として使用します。 http://docs.python.org/library/functions.html –

答えて

1

あなたのいわゆる「純粋なPython」ソリューションは意味をなさない、私は恐れています。最初はenumerateが組み込まれていますので、enumerate(vars)を呼び出してください。第二に、new_varsにタプルを追加するので、var in new_varsは決して真ではありません。第3に、そのdelステートメントで何をしようとしているのかわかりません。反復処理中のものは決して変更しないでください。

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

return var_dict.values() 

クエリセットと同じようにうまく機能:

Pythonでより良い解決策は次のようなものかもしれません。

私が正しく理解していれば、あなたはdbレベルの解決策をとっています。集計関数は選択されている行全体で機能するため、これは不可能です。 の一意の値を取得できますが、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') 

はそうダム感じ..

関連する問題