Как мне сделать простой метод next () на M2M в SQLAlchemy? - PullRequest
1 голос
/ 04 мая 2011

У меня есть две модели со многими ко многим, Групповая и Индивидуальная.

Я могу получить доступ к group.individuals и получить список связанных лиц. У меня есть столбец «last_individual_id» на моделях группы, чтобы отслеживать последнего использованного человека. С этой информацией я бродил, как получить следующий человек для группы.

Я думал о том, чтобы получить идентификаторы для физических лиц и использовать itertools.cycle, но я не могу указать начальную точку. Кроме того, это может быть медленный способ сделать это, если я могу просто сделать это правильно в SQLAlchemy.

Есть мысли о том, как этого добиться? Я чувствую, что буду смущен тем, насколько простой ответ ... но у меня сегодня не было кофеина!

Спасибо

1 Ответ

0 голосов
/ 04 мая 2011

Одной из возможностей является использование itertools.dropeding (но это может быть ограничено, поскольку область действия вашего желаемого решения, как неясно, также itertools.

Вы не предоставили много деталей о вашей модели данных. Я предполагаю, что group.individuals возвращает список индивидуальных объектов, а свойство .id представляет идентификатор каждого человека. Например, вы ищете индивидуальный идентификатор 7 в списке group.individuals:

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

Он будет проходить по списку, пока не найдет id = 7 (или более точно, до тех пор, пока x.id! = 7, поскольку itertools.dropndom ничего не вернет до первого ложного теста), затем начнет возвращать отдельных лиц. объекты из списка. Поэтому, если идентификаторы из этого списка имеют вид: [1, 19, 5, 6, 7, 2, 4, 5], это вернет: 7 2 4 5.

Для ваших целей звучит так, что вы проигнорируете первый возвращенный ответ, а затем используете ответы после.

Еще одна альтернатива - перебрать ваш первоначальный список group.individuals, чтобы найти индекс нужного вам идентификатора, а затем просто увеличить индекс - это также позволит вам начать индекс с нуля, если ваш вычисленный индекс превышает ваш список, например:

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)

Но, конечно, это более дискретно и не повторяется. Вероятно, есть много других способов приблизиться к этому (в том числе сделать мою функцию повторяемой), но у меня еще не было кофеина!

...