Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 21, 2010 18:17:24

Mutagena
От:
Зарегистрирован: 2009-10-18
Сообщения: 295
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с правильной выборкой

Имеется такая модель:

class Subject(models.Model):
subject = models.CharField(max_length=100)

def __unicode__(self):
return self.subject

class ClassGroup(models.Model):
title = models.CharField(max_length=3)
subjects = models.ManyToManyField(Subject)

def __unicode__(self):
return self.title

class Student(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
class_group = models.ForeignKey(ClassGroup)
parent = models.ManyToManyField(User)

def __unicode__(self):
return self.last_name

class Mark(models.Model):
mark = models.SmallIntegerField(max_length=1)
student_id = models.ForeignKey(Student)
subject_id = models.ForeignKey(Subject)
date = models.DateField()

def __unicode__(self):
pr_mark = str(self.mark)
return pr_mark
Нужно выбрать все предметы у заданного ученика.
Я пишу так:
curent_student = Student.objects.get(id=student_id)
curent_class = ClassGroup.objects.get(title=curent_student.class_group.title)
subject_list = curent_class.subjects
В шаблоне пытаюсь выполнить итерацию по subject_list, но получаю ошибку
“Caught an exception while rendering: ‘ManyRelatedManager’ object is not iterable”
Подскажите, как правильно в данном случае сделать выборку?



Офлайн

#2 Янв. 21, 2010 21:56:11

k0sh
От:
Зарегистрирован: 2009-10-08
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с правильной выборкой

subject_list = curent_class.subjects.all()



Офлайн

#3 Янв. 21, 2010 22:20:41

Mutagena
От:
Зарегистрирован: 2009-10-18
Сообщения: 295
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с правильной выборкой

k0sh, спасибо ) всё элементарно )



Офлайн

#4 Янв. 22, 2010 18:53:21

Mutagena
От:
Зарегистрирован: 2009-10-18
Сообщения: 295
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с правильной выборкой

Опять вопрос по выборке. Модель та же самая, что приведена выше.
Нужно осуществить такую выборку, чтобы был список с длиной, равной количеству предметов (то есть объектов Subject). Каждый элемент списка - кортеж с двумя элементами: предмет и список с оценками студента по этому предмету. Длина списка с оценками должна равняться количеству дней в необходимом месяце. То есть, если оценки в какой-либо день по определённому предмету не было, то добавляется пустая строка.
Я делаю вот так:

def diary(request, student_id=1, year=datetime.date.today().year, month=datetime.date.today().month):
if request.user.is_authenticated():
year = int(year)
month = int(month)

# list of students into sidebar
student_list = Student.objects.filter(parent=request.user)

# list of dates into sidebar
mark_list = Mark.objects.filter(student_id=student_id)
first_month = Mark.objects.get(id=1).date.month
first_year = Mark.objects.get(id=1).date.year
dates = []
dates.append({'year': first_year, 'month': first_month})
for mark in mark_list:
if (mark.date.year != first_year) and (mark.date.month != first_month):
dates.append({'year': first_year, 'month': first_month})

current_student = Student.objects.get(id=student_id)
current_class = ClassGroup.objects.get(title=current_student.class_group.title)
subject_list = current_class.subjects.all()

current_date = datetime.date(year, month, 1)
kolweeks, koldays = calendar.monthrange(current_date.year, current_date.month)

marks1 = []
for subject in subject_list:
marks_arr = []
i = 1
while i <= koldays:
try:
# запрос, который необходимо правильно построить
mark = Mark.objects.get(student_id = current_student,
subject_id = subject,
date = datetime.date(year, month, i))
except:
mark = ""
finally:
marks_arr.append(mark)
i = i + 1
marks1.append((subject, marks_arr))

return render_to_response
....
Но получаю такой список marks1:
[(<Subject: Математика>, ), (<Subject: Физика>, ), (<Subject: Информатика>, )]
то, есть оценок в списке нет.
Помогите правильно построить выборку.



Офлайн

#5 Янв. 23, 2010 00:03:36

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Помогите с правильной выборкой

По выборке, не скажу, ибо пора спать)
НО:

(...year=datetime.date.today().year, month=datetime.date.today().month)
выполнится только 1 раз при запуске вашей аппликухи,
if request.user.is_authenticated():
лучше заменить на @login_required
ну дальше у вас похоже каша)

Офлайн

#6 Янв. 23, 2010 21:26:49

Mutagena
От:
Зарегистрирован: 2009-10-18
Сообщения: 295
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с правильной выборкой

Уже сама разобралась. Делаю так:

        for subject in subject_list:
marks = []
for day in range(1, array_base + 1):
try:
mark = Mark.objects.get(student_id = current_student,
subject_id = subject,
date__year = current_date.year,
date__month = current_date.month,
date__day = day)
except:
mark = ""
finally:
marks.append(mark)
subject_mark_list1.append((subject, marks))



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version