Yui
(p)
13.Февраль.2021 11:24:05
#1
Можно ли как-нибудь отфильтровать записи, вызванные методом all() ? У меня во views.py есть такие наборы записей:
classes = clas.objects.all()
students = Student.objects.all()
counts = Student.objects.filter(days=1).filter(teacher=classes.teacher).count()
counts_all = Student.objects.filter(teacher=classes.teacher).count()
Можно ли выполнить фильтрацию для еще неполученного класса?
models.py
class Student(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
teacher = models.ForeignKey(MyUser, on_delete=models.CASCADE, default='')
days = models.IntegerField(default=0)
days_mounth = models.IntegerField(default=0)
days_all = models.IntegerField(default=0)
days_eat = models.IntegerField(default=0)
date_change = models.DateField(auto_now=True)
def __str__(self):
return self.first_name + '---' + self.last_name
class clas(models.Model):
name = models.CharField(max_length=50)
students = models.ManyToManyField(Student, blank=True)
teacher = models.OneToOneField(MyUser, on_delete = models.CASCADE, default='')
AlexP
(Alex P.)
13.Февраль.2021 11:50:32
#2
Так а почему б сразу не использовать filter
?
Но all() вроде бы тоже возвращает QuerySet, так что наверно можно вызвать filter
и потом если надо.
Yui
(p)
13.Февраль.2021 11:57:10
#3
А какое в таком случае нужно условие фильтрации?
Идея заключалось в том, чтобы выводить общее кол-во учеников в этом классе и отмеченных учеников(которые в школе в этот день, у отмеченных учеников значение days равно 1)
days = models.IntegerField(default=0)
Yui
(p)
13.Февраль.2021 12:14:24
#5
тогда будут выводится все ученики, которые были сегодня в школе, а надо, чтобы они выводились для каждого класса.Например:
3а
Присутсвует 22 из 30
AlexP
(Alex P.)
13.Февраль.2021 12:42:25
#6
Например в цикле по classes
можно обращаться к его полю students
.
Только при первой загрузке классов наверно желательно добавить prefetch_related
, чтобы не было N+1 запросов
classes = clas.objects.prefetch_related('students').all()
Yui
(p)
13.Февраль.2021 13:53:49
#7
В самом питоне? Как потом передать все эти значения в html?
AlexP
(Alex P.)
13.Февраль.2021 13:58:40
#8
Так а как сейчас классы выводятся? Наверно ж есть цикл по ним.
Yui
(p)
13.Февраль.2021 14:04:20
#9
Да, но в html же не получится фильтровать
AlexP
(Alex P.)
13.Февраль.2021 14:18:46
#10
Yui
(p)
13.Февраль.2021 14:43:56
#11
и они будут работать как методы?
AlexP
(Alex P.)
13.Февраль.2021 14:51:24
#12
Как свойства, class.someStudents
. Если без параметров.
Yui
(p)
13.Февраль.2021 15:35:48
#13
а этот метод как-то отличается от диспетчеров записей?
Yui
(p)
13.Февраль.2021 17:12:55
#15
AlexP
(Alex P.)
13.Февраль.2021 18:16:52
#16
По-моему это тут не очень подходит, тогда ж придется еще добавлять параметр, чтобы отфильтровать сначала студентов этого класса.
И метод все равно придется добавить, чтобы получить доступ из шаблона.
Вообще тут с days
что-то не то, скорее всего оно не в студенте должно быть, а например сделать еще одну модель со ссылками на студента и класс, и инфой о дне. Иначе как, создавать нового студента на каждый класс и день?
Yui
(p)
13.Февраль.2021 18:20:36
#17
Это все обнуляется каждый день
Я просто не понимаю до конца как действовать в шаблоне. То что можно сделать фунцию это понятно, непонятно как это все подсчитать в шаблоне
Yui
(p)
13.Февраль.2021 18:30:02
#18
думаю к такой конструкции прибегнуть:
for cl in classes:
if 'c' not in context:
context['c'] = [[cl.name, cl.students.filter(days=1).count()]]
else:
context['c'] = context.get('c') + [[cl.name, cl.students.filter(days=1).count()]]
AlexP
(Alex P.)
13.Февраль.2021 18:31:20
#19
Так просто передать классы в шаблон, и у класса в цикле в шаблоне она должна работать как все остальные свойства класса.
AlexP:
class.someStudents
Yui
(p)
13.Февраль.2021 18:33:57
#20
то есть вот так, а в шаблоне просто вызывать class.get ?
class clas(models.Model):
name = models.CharField(max_length=50)
students = models.ManyToManyField(Student, blank=True)
teacher = models.OneToOneField(MyUser, on_delete = models.CASCADE, default='')
def get(self):
return self.students.filter(days=1).count()