Фильтрация

Можно ли как-нибудь отфильтровать записи, вызванные методом 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='')

Так а почему б сразу не использовать filter?

Но all() вроде бы тоже возвращает QuerySet, так что наверно можно вызвать filter и потом если надо.

А какое в таком случае нужно условие фильтрации?

Идея заключалось в том, чтобы выводить общее кол-во учеников в этом классе и отмеченных учеников(которые в школе в этот день, у отмеченных учеников значение days равно 1)

days = models.IntegerField(default=0)

Так а это не работает?

тогда будут выводится все ученики, которые были сегодня в школе, а надо, чтобы они выводились для каждого класса.Например:

Присутсвует 22 из 30

Например в цикле по classes можно обращаться к его полю students.

Только при первой загрузке классов наверно желательно добавить prefetch_related, чтобы не было N+1 запросов

classes = clas.objects.prefetch_related('students').all()

В самом питоне? Как потом передать все эти значения в html?

Так а как сейчас классы выводятся? Наверно ж есть цикл по ним.

Да, но в html же не получится фильтровать

А, да. Можно в модель добавить функции возвращающие то, что нужно.

https://docs.djangoproject.com/en/3.1/topics/db/models/#model-methods

и они будут работать как методы?

Как свойства, class.someStudents. Если без параметров.

а этот метод как-то отличается от диспетчеров записей?

это что? :thinking:

объекты, предоставляющие доступ к набору записей, которые хранятся в модели
https://docs.djangoproject.com/en/3.1/topics/db/managers/#django.db.models.Manager

По-моему это тут не очень подходит, тогда ж придется еще добавлять параметр, чтобы отфильтровать сначала студентов этого класса.
И метод все равно придется добавить, чтобы получить доступ из шаблона.


Вообще тут с days что-то не то, скорее всего оно не в студенте должно быть, а например сделать еще одну модель со ссылками на студента и класс, и инфой о дне. Иначе как, создавать нового студента на каждый класс и день?

Это все обнуляется каждый день

Я просто не понимаю до конца как действовать в шаблоне. То что можно сделать фунцию это понятно, непонятно как это все подсчитать в шаблоне

думаю к такой конструкции прибегнуть:

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()]]

Так просто передать классы в шаблон, и у класса в цикле в шаблоне она должна работать как все остальные свойства класса.

то есть вот так, а в шаблоне просто вызывать 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()