Я следующие модели:Джанго QuerySets: Получите уникальный/первый элемент из ForeignKey поля
class SchoolClass(models.Model):
title = models.CharField()
max_students = models.IntegerField(default=10)
is_published = models.BooleanField(default=False)
class Session(models.Model):
school_class = models.ForeignKey(SchoolClass, related_name="sessions")
start_date = models.DateField()
enrolled_students = models.IntegerField()
SchoolClass может иметь несколько сеансов (например, «Математика для чайников» в понедельник, вторник и пятницу = 3 Sessions) ,
На моей странице с индексом (ListView) я хотел бы показать все предстоящие классы (которые имеют хотя бы один сеанс) только один раз, поскольку классы, которые имеют много сеансов, сделают обзор грязным.
Как я могу создать список Session-объектов (я могу получить соответствующую информацию курса через session.school_class), которые отвечают следующим требованиям:
start_date__gte=datetime.now().date()
school_class.is_published=True
- это первый элемент SchoolClass (
oder_by('start_date')[0]
)
Спасибо!
PS: Я бегу MySQL в качестве БД, так различны ('поле') не будет работать ..
Edit:
Ниже мое текущее решение, которое работает , но это не очень чистый (избыточные хиты на БД)
def get_sessions_mixin(filter_args):
session_qs = []
qs = SchoolClass.objects.filter(**filter_args)
for schoolclass in qs:
session_qs.append(schoolclass.get_first_session())
#session_qs = Session.objects.filter(course_meta__is_deleted=False, date_from__gte=datetime.now().date()).\
# annotate(Max('date_from'))
#session_qs = qs.order_by('get_first_session__date_from')
return session_qs
и внутри models.py
class Sessions(models.Model):
# ...
def get_first_session(self):
if self.is_published:
tmp_sessions = self.sessions.filter(date_from__gte=datetime.now().date())
if tmp_sessions:
return tmp_sessions.order_by('date_from')[0]
return None
Не могли бы вы объяснить, пожалуйста, более четкое определение третьей отметки. – mariodev
Уверен. Если объект SchoolClass связан с, например,3 Объекты сеанса, я просто хочу первый (самый ранний) объект Session в QuerySet –