2011-05-03 32 views
1

我有兩個模型,多對多,組和個人。如何在SQLAlchemy中的M2M上執行簡單的next()方法?

我可以訪問group.individuals並獲取相關個人的列表。我在組模型上有一個'last_individual_id'列以跟蹤上次使用的個人。有了這些信息,我一直在徘徊如何獲得集團的下一個人。

我想爲個人獲取id並使用itertools.cycle,但我無法指定起點。另外,如果我可以在SQLAlchemy中正確地做到這一點,這可能是一個很慢的方法。

有關如何完成此任何想法?我覺得我會因爲答案的簡單程度而感到尷尬......但我今天沒有咖啡因!

感謝

+0

在迭代器的意義上,你不是指'next()',是嗎? – letitbee 2011-05-10 19:34:42

+0

你沒有很清楚地說明問題。什麼是相應的sql,就像'select individual.id from individual join groups on(individual.group_id = group.id)where individual.id> groups.last_individual_id order by individual.id limit 1'? – letitbee 2011-05-10 19:41:15

回答

0

一種可能性是使用itertools.dropwhile(但是這可能被限制了您所需的解決方案的範圍,因爲它是不明確的,也itertools.dropwhile通過您的列表喜歡itertools不會無限循環.cycle)。

您沒有提供很多數據模型的詳細信息。我會假設group.individuals返回個人對象列表,'.id'屬性代表每個人的id號。例如,假設你找個人ID 7,group.individuals的列表中:

from itertools import dropwhile 
for item in dropwhile(lambda x: x.id != 7, group.individuals): 
    print item 

這將通過列表,直到它找到ID = 7(或更多acurately,直到x.id = 7 ,因爲itertools.dropwhile在第一次False測試之前不會返回任何東西),那麼它將開始從列表中返回單個對象。因此,如果該列表中的ID是[1,19,5,6,7,2,4,5],則返回:7 2 4 5.

出於您的目的,聽起來像您會忽略首先返回響應,然後使用響應。

另一種替代方法是迭代group.individuals的原始列表以找到您想要的id的索引,然後僅增加索引 - 如果您的計算索引超過,這也允許您在0處開始索引您的列表,例如:

def nextrecord(recordlist, value):  
    for i in range(len(recordlist)):   
     if recordlist[i].id == value: 
      newindex = i + 1 
      break 
    if newindex >= len(recordlist): 
     newindex = 0  
    return recordlist[newindex] 

print nextrecord(group.individuals, 7) 

但是,當然,這是更離散,不可迭代。有可能有很多其他方法來處理這個問題(包括使我的函數可迭代),但我還沒有我的咖啡因呢!

+0

Raceymans的第二個解決方案提供了我的答案。我已經清除了我的瀏覽器cookies,因此我不能選擇它作爲答案。如果某些管理員可以選擇他的回覆並刪除此評論,我們可以清理這一個。比 – 2011-05-11 17:47:38

相關問題