2011-01-04 11 views
2

私は、モデル要素のインスタンスを含むクエリーセット「要素」を持っています。要素は、外部キー「シリーズ」を持って、それぞれのシリーズは、フィールドがあります。Djangoの複数のフィールドにわたる一意の値からのdictsのリスト

subtopic_1_name 
subtopic_1_slug 
subtopic_2_name 
subtopic_2_slug 
subtopic_3_name 
subtopic_3_slug 

私は、フォーム

[{'name': 'somename', 'slug': 'someslug'}, {'name': 'anothername' 'slug': 'anotherslug'}, ... ] 

の「name」と「スラグのdictsの「フラット化」のリストを生成する必要があります'は空の文字列を除く3つの名前とスラッグフィールドからの一意の値に対応します。私は現在、一意性をチェックするために 'not in'という非効率なforループを使用しています。それは機能しますが、「要素」が1.9Mまでのメンバーを持つことができるため、遅すぎます。

効率的な方法は何ですか?

更新:

subtopic_list = [] 
ones = elements.values_list('series__subtopic1_name', 'series__subtopic1_slug').distinct() 
twos = elements.values_list('series__subtopic2_name', 'series__subtopic2_slug').distinct() 
threes = elements.values_list('series__subtopic3_name', 'series__subtopic3_slug').distinct() 
for num in [ones, twos, threes]: 
    for name, slug in num: 
     if name != '': 
      subtopic_list.append({'name': name, 'slug': slug)} 

答えて

0

何除外」を使用してDBクエリで空の名前をフィルタリングについて:

は、ここで私がこれまで持っていますが、より高速な方法が存在しなければならベストですか?

ones = elements.exclude('series__subtopic1_name'='').\ 
    values_list('series__subtopic1_name','series__subtopic1_slug').distinct() 

twos = elements.exclude('series__subtopic2_name'='').\ 
    values_list('series__subtopic2_name', 'series__subtopic2_slug').distinct() 

threes = elements.exclude('series__subtopic3_name'='').\ 
    values_list('series__subtopic3_name', 'series__subtopic3_slug').distinct() 

# concatenate element of twos and threes into list 'ones' 
ones.extend(twos) 
ones.extend(threes) 

# we already filtered empty names in the db query, 
# so we can just return the subtopic_list 
subtopic_list = [{'name': name, 'slug': slug} for name, slug in ones] 
+0

ありがとうございます。私は3つのdistinct()呼び出しの必要性を避ける方法を望んでいましたが、これはより洗練されたコードです。 – thebenedict

+0

なぜあなたはdistinct()呼び出しを取り除きたいですか?可能ですが、あなたの質問では、高価なforループを排除したいと述べたとおっしゃいました。 – Tommy

関連する問題