2017-04-19 55 views
0

我有這樣一個觀點:Django的:爲了一個QuerySet

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) 

和結果是一個QuerySet,看起來像這樣:

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不工作。

任何人都可以給我一個提示如何排序querySet我找不到有用的東西我自己。

我需要這個在視圖中工作,所以它不能/不應該在模型中完成。感謝您的任何建議。

+0

套件未訂購。你爲什麼使用一個?爲什麼不列出? –

回答

1

結果是一個QuerySet它看起來像這樣

其實這是一個set(蟒蛇內建類型),而不是一個QuerySet(Django的ORM型)。

set是一種無序的集合類型。要「排序」,你首先必須將它變成list - 這實際上很簡單,如newlist = list(newset), 然後你可以用newlist.sort()就地排序列表。既然你想成爲它的項目第二要素排序的這份名單中,你需要使用key參數告訴sort你要排序的內容:

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)])位開始,我得到了與list()沒有屬性「add」相同的失敗消息。 – Marla

+0

當然......一個'list'不是'set',所以API是不一樣的。你要找的是'list.append()'(你也許想花幾個小時學習使用基本的Python數據類型,這可能會節省相當長的一段時間)。 –

1

我想你可能在這裏有一個集合,一個列表和一個QuerySet有點混淆?一個集合是無序的,而一個列表不是。集合不公開上面列出的方法(filter,order_by,split,join)。 QuerySet是一個Django特有的類,它有許多有用的方法。

我認爲這將是簡單的方式,newSet元組的列表,然後使用list.sort(key=lambda x: x[1])value下令名單。

如果val的計算是符合它雖然,我推薦使用annotate,然後廢除newDictnewSet,並簡單地傳回的物品查詢集,這將是更簡單,更快的可能,並訂購通過使用articles.order_by('value')。如果你發佈val的計算,我會試着告訴你這是否可行。

+0

是的你是對的我完全錯過了差異。我開始閱讀有關集合,列表和QuerySets之間的區別。感謝您指出了這一點。並感謝評論我真的很感謝你的支持:) – Marla