Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 10, 2014 14:25:46

anton41k
Зарегистрирован: 2013-12-18
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany

Кто знает если есть такая модель, как можно вывести все оценки определенного студента какого-то заданого предмета?

# -*- coding: utf-8 -*-
from django.db import models
class Subjects(models.Model):
    name_teacher=models.CharField(max_length=50, verbose_name=u'Полное имя преподавателя')
    subject=models.CharField(max_length=50, verbose_name=u'Предмет')
    def __unicode__(self):
        return u'%s'%(self.subject)
class Students(models.Model):
    name = models.CharField(max_length=50, verbose_name=u'Полное имя')
    date_of_birth = models.DateField(verbose_name=u'Дата рождения')
    num_stud=models.CharField(max_length=50,verbose_name=u'Номер студ. билета ')
    group=models.ForeignKey('Groups',verbose_name=u'Группа, к которой прикреплен студент')
    subject_stud=models.ManyToManyField('Subjects',blank=True, null=True, verbose_name='Предмет, который изучает студент')
    def __unicode__(self):
        return u'%s'%(self.name)
class Groups(models.Model):
    name_group = models.CharField(max_length=100, verbose_name=u'Название группы')
    headman = models.ForeignKey('Students', blank=True, null=True, verbose_name=(u'Староста'), related_name='students')
    subject_group=models.ManyToManyField('Subjects',blank=True, null=True, verbose_name='Изучаемые предметы')
    def __unicode__(self):
        return u'%s'%(self.name_group)
class Marks(models.Model):
    mark=models.IntegerField( verbose_name=u'Оценка')
    stud_mark=models.ManyToManyField('Students',blank=True, null=True, verbose_name='Оценки студента')
    subject_mark=models.ManyToManyField('Subjects',blank=True, null=True, verbose_name='Оценки по предмету')
    data_mark=models.DateField(verbose_name=u'Дата оценки')
    def __unicode__(self):
        return u'%s'%(self.mark)

У меня например (правельно ли это)
s=Subjects.objects.get(pk=sub_id)——–предмет
stud=s.students_set.all()——————–Все студенты
o=stud(2).marks_set.filter(subject_mark=s)–оценки 3-го по счету студента этого предмета
И как мне записать в шаблоне все это? Если у меня есть страница из таблицей (название Предмет) потом идут строки с именем студента и его оценками по этому предмету.
(sub':s,'stud':stud)
<table border="2" align="center"  >
	<caption><h1> Оценки по предмету {{sub.subject}} </h1></caption>
	<tr style="background-color:gray">
		<th></th>
 		<th>Имя, фамилия студента</th>
 		<th >Оценка</th></tr>
		{%for i in stud%}
	<tr style="background-color:silver">
		<td scope="row">{{forloop.counter}}.</td>
		<td scope="row"><a href="/grou/{{ i.id }}/">{{ i.name }}</a></td>
		{%for j in i.marks_set.all%}  -------------вот сдесь как записать что бы не все оценки были а только те которые имеет студент по определенному предмету stud(2).marks_set.filter(subject_mark=s)
		<td style="background-color:white">{{j}}
		</td>{%endfor%}
		</tr>{%endfor%}
	
</table>

Отредактировано anton41k (Фев. 10, 2014 18:11:19)

Офлайн

#2 Фев. 10, 2014 14:43:24

anton41k
Зарегистрирован: 2013-12-18
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany

Может с помощью какого-то фильтра?

Офлайн

#4 Фев. 11, 2014 06:13:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

ManyToMany

Не нужно этого делать в шаблоне, сделайте всю выборку во view, приведите результат к удобному виду и передайте его в составе контекста в шаблон.



Офлайн

#5 Фев. 11, 2014 14:17:27

anton41k
Зарегистрирован: 2013-12-18
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany

Нашел такое решение:

from django import template
from students.models import Students,Groups,Subjects,Marks
register=template.Library()
@register.filter
def filtrmark(value,arg):
	s=Subjects.objects.get(pk=arg)
	return value.marks_set.filter(subject_mark=s)

Офлайн

#6 Фев. 11, 2014 14:31:54

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

ManyToMany

anton41k
шо это за костыль?

Кстати в Marks надо сменить many на foreighn

https://docs.djangoproject.com/en/1.6/topics/db/queries/#lookups-that-span-relationships

Отредактировано Singularity (Фев. 11, 2014 14:35:43)

Офлайн

#7 Фев. 11, 2014 19:30:53

anton41k
Зарегистрирован: 2013-12-18
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany

Но мне нужно что бы у каждой оценки была своя дата.А если сделать как вы предлогаете то прийдется добавлять еще класс даты.

Офлайн

#8 Фев. 11, 2014 19:33:04

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

ManyToMany

anton41k
Но мне нужно что бы у каждой оценки была своя дата.А если сделать как вы предлогаете то прийдется добавлять еще класс даты.
я не понял вашей логики

Офлайн

#9 Фев. 11, 2014 19:46:06

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

ManyToMany

Это костыльный метод. Но будет работать, я бы оценки достал отсортированные по студентам, а затем бы вывел и по порядку с указанием студента и даты. Должно вроде работать.

Офлайн

#10 Фев. 11, 2014 20:04:34

anton41k
Зарегистрирован: 2013-12-18
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany

Да если разобратся то вы правы.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version