2011-05-03 3 views
1

나는 많은 것을 가진 2 개의 모형, 그룹 및 개인이있다.SQLAlchemy의 M2M에서 간단한 next() 메서드는 어떻게 수행합니까?

나는 group.individuals에 액세스하여 관련 개인 목록을 얻을 수 있습니다. 마지막으로 사용한 개인을 추적하기 위해 그룹 모델에 'last_individual_id'열이 있습니다. 이 정보로 나는 그룹의 다음 개인을 얻는 방법을 배회하고있었습니다.

개인에 대한 ID를 얻고 itertools.cycle을 사용하여 생각했지만 시작점을 지정할 수 없습니다. 게다가 SQLAlchemy에서 제대로 수행 할 수 있다면 느린 방법 일 수 있습니다.

이 작업을 수행하는 방법에 대한 의견이 있으십니까? 나는 대답이 얼마나 단순한가에 난처하게 될 것 같은 느낌이 든다. 그러나 나는 카페인을 오늘 가지지 않고 있었다!

감사

+0

이터레이터의 의미에서'next()'를 의미하지 않습니까? – letitbee

+0

당신은 문제를 아주 명확하게 진술하지 않았습니다. 해당 SQL은 무엇입니까? 'individual.id> group.id (individual.id> groups.id)에서 groups.last_individual_id order by individual.id limit 1'에있는 개인의 select individual.id와 같은 것일 수 있습니까? – letitbee

답변

0

하나의 가능성은 itertools.dropwhile을 사용하고 있습니다 (그러나 이것은 분명히 아니므로, 원하는 솔루션의 범위로 제한 될 수 있습니다, 또한 itertools.dropwhile는 itertools처럼 목록을하지 무한주기를 수행 .cycle 않습니다).

데이터 모델에 대한 세부 정보를 많이 제공하지 않았습니다. 나는 그 그룹을 추정 할 것이다. 개인은 개인 개체의 목록을 반환하고 '.id'속성은 각 개인의 ID 번호를 나타낸다. ! ID = 7 (또는 그 이상 acurately, x.id까지 = 7이 찾을 때까지

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

이 목록을 통해 이동합니다 : 예를 들어,이 group.individuals의 목록 내에서 개별 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의 두 번째 솔루션이 내 대답을 제공했습니다. 나는 대답으로 선택할 수 없도록 브라우저 쿠키를 지웠다. 어떤 관리자가 자신의 응답을 선택하고이 설명을 삭제할 수 있다면 우리는 이것을 정리할 수 있습니다. 보다 –