2013-04-09 5 views
1

У меня есть довольно пустой вопрос относительно итерации, что я не могу показаться правильным.Django query/Iteration issue

У меня есть таблица, в которой хранится запись для каждого ежемесячного теста, который пользователь завершает, если они пропускают месяц, а в таблице нет записи.

Я хочу вытащить историю пользователей из таблицы, а затем для каждого из 12 месяцев установите Y или N в соответствии с их статусом.

Вот мой код:

def getSafetyHistory(self, id): 
    results = [] 
    safety_courses = UserMonthlySafetyCurriculums.objects.filter(users_id=id).order_by('month_assigned') 
    for i in range(1, 13): 
     for s in safety_courses: 
      if s.month_assigned == i: 
       results.append('Y') 
      else: 
       results.append('N') 

    return results 

Так что мой идеальный результат был бы список 12 записей, либо Y или N т.е. результаты = [N, N, Y, N, N, Y, Y , Y, N, N, N, Y]

Вышеприведенный запрос возвращает 2 записи для пользователя, который является правильным, но на моей итерации я получаю 24 записи, очевидно, из-за внешних и внутренних циклов, но я не уверенный в «питоническом» способе, я должен делать это без тонны вложенных циклов.

ответ

1

Возможно, есть много способов сделать это. Вот одна идея.

Похоже, вы только собираетесь получить записи о пройденных курсах. Таким образом, вы можете предварительно создать список из 12 результатов, все настроены на нет. Затем после запроса базы данных вы переворачиваете те, которые соответствуют датам, которые соответствуют полученным результатам.

results = ['N'] * 12 # prebuild results to all no 

safety_courses = UserMonthlySafetyCurriculums.objects.filter(
        users_id=id).order_by('month_assigned') 

for course in safety_courses: 
    results[course.month_assigned - 1] = 'Y' 

Это предполагает month_assigned является целым числом от 1 до 12, так как ваш код намекает.

+0

Да, это сработало как шарм! Большое спасибо за помощь, определенно фрагмент, который я сэкономлю. Еще раз спасибо! – xXPhenom22Xx