2017-04-19 10 views
0

私はこのような見解を持っている:ジャンゴ:順序クエリセット

def profile (request): 
    articles = Post.thing.all() 
    newSet = set() 
    def score(): 
     for thing in articles: 
      Val = some calculation... 
      .... 
      newSet.update([(thing,Val)])  
    score() 
    context = { 
    'articles': articles.order_by('id'), 
    'newSet':newSet, 
    } 
    return render(request,'my_profile/my_profile.html',context) 

と結果は次のようになりますどのクエリセットです。

set([(<thing: sfd>, 1), (<thing: quality>, 0), (<thing: hello>, -1), (<thing: hey>, 4), (<thing: test>, 0) 

私は今ではセットを注文しようとしています与えられた値は最高の値から始まるリストですが、私が行うときnewSet.order_by/filter/split/join 'set' object has no attribute join/filter/split以降は動作しません。

誰でも私にヒントを教えてもらえますか?自分で役立つものは何も見つかりませんでした。

モデルではできない/できないように、ビューで作業するにはこれが必要です。助言をいただきありがとうございます。

+0

セットは発注されていません。なぜあなたは1つを使用していますか?なぜリストではないのですか? –

答えて

1

成果は、実際に、これは、ないQuerySet(DjangoのORMタイプ)set(Pythonの組み込み型)である。この

のように見えたクエリセットです。

setは、順序付けられていないコレクションタイプです。 「並べ替える」にはまずlistにする必要があります。これは実際にはnewlist = list(newset)、 と同じくらい単純なものです。その場合はリストをnewlist.sort()で並べ替えることができます。このリストは、それの項目の2番目の要素をソートしたいので、あなたがソートしたいものにsortを伝えるためにkey引数を使用する必要があります:

newlist.sort(key=lambda item: item[1]) 

またはあなただけの店にあなたのscore()機能を変更することができます(score, obj)タプルの代わりにlist.sort()が自然にRightThingを実行します(タプルは最初の項目でソートされます)。

我々はそれでいる間:代わりに、単一の項目のリストをnewSet.update()を呼び出すのは、あなただけではなく、すなわちnewSet.add()を使用することができます。

def score(): 
    for thing in articles: 
     val = some calculation... 
     .... 
     newset.add((thing, val)) 
     # or if you don't want to specify a callback 
     # for `list.sort()`: 
     # newset.add((val, thing)) 

そして最後に:あなたは本当にすべてでsetが必要なのかここに ?最初からlistを使用しないのはなぜですか?

+0

"newlist = list(newset)"でうまくいきました。私はnewSet = list()とnewSet.add([(thing、Val)])で始めることを試みましたbit list()に "add"という属性がないという同じ失敗メッセージが出ました。 – Marla

+0

もちろん、リストは 'set'ではないので、APIは同じではありません。あなたが探しているのは 'list.append()'です(また、基本的なPythonデータ型の使用方法を学ぶのに2,3時間かかることもありますが、かなり時間を節約できます)。 –

1

ここでは、セットとリストとQuerySetの間に少し混乱するかもしれないと思いますか?セットは順序付けされていませんが、リストは順序付けされていません。セットは上記のメソッドを公開しません(filter、order_by、split、join)。 QuerySetは多くの便利なメソッドを持つDjango固有のクラスです。

newSetにタプルのリストを作成し、そのリストをvaluelist.sort(key=lambda x: x[1])を使用して注文する方が簡単だと思います。

ヴァルのあなたの計算はしかしそれのために資格がある場合、私はannotateを使用して、離れnewDictnewSetとやってお勧めします、と単純に速く多分、はるかに簡単になります記事のクエリセットを、バックパス、および注文可能な思いarticles.order_by('value')を使用してください。 valの計算を投稿した場合は、それが可能かどうかを教えてください。

+0

はい、あなたは私が全く違いを見逃しました。私は、セット、リスト、およびクエリセットの違いについて読み始めました。それを指摘してくれてありがとう。コメントをいただきありがとうございます。本当にありがとうございます:) – Marla