Форум сайта python.su
Имеется такая модель:
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 = curent_class.subjects.all()
Офлайн
k0sh, спасибо ) всё элементарно )
Офлайн
Опять вопрос по выборке. Модель та же самая, что приведена выше.
Нужно осуществить такую выборку, чтобы был список с длиной, равной количеству предметов (то есть объектов 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
....
Офлайн
По выборке, не скажу, ибо пора спать)
НО:
(...year=datetime.date.today().year, month=datetime.date.today().month)
if request.user.is_authenticated():
Офлайн
Уже сама разобралась. Делаю так:
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))
Офлайн