У меня есть две модели:
class Course(models.Model):
course_type = models.ForeignKey(CourseType,
related_name='course_type_courses',
on_delete=models.PROTECT)
name = models.CharField(max_length=255)
course_category = models.ForeignKey(CourseCategory,
related_name='category_courses',
on_delete=models.PROTECT)
course_format = models.ForeignKey(CourseFormat,
related_name='format_courses',
on_delete=models.PROTECT)
school = models.ForeignKey(School,
related_name='school_courses',
blank=True,
null=True,
on_delete=models.PROTECT)
room = models.IntegerField(blank=True,
null=True)
active_status = models.IntegerField(default=1,
blank=True,
null=True)
description = models.CharField(max_length=255,
blank=True,
null=True)
schedule = models.ManyToManyField(Schedule)
sessions = models.IntegerField(default=0)
progress = models.CharField(max_length=100,
default="P1W1")
start_date = models.DateField(blank=True,
null=True)
class Demo(models.Model):
course_category = models.ForeignKey(CourseCategory, related_name='category_demos', on_delete=models.PROTECT)
date = models.DateField(blank=True, null=True)
schedule = models.ManyToManyField(Schedule)
weekly = models.BooleanField(default=False)
pm = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='pm_demos', on_delete=models.PROTECT)
cf = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='cf_demos', on_delete=models.PROTECT)
active_status = models.BooleanField(default=1)
demo = models.BooleanField(default=1)
Обе имеют общую связь m2m с моделью «Расписание»:
class Schedule(models.Model):
day = models.ForeignKey(Weekdays, on_delete=models.PROTECT)
start_time = models.TimeField()
end_time = models.TimeField()
У меня есть еще одна таблица, связывающая пользователей с курсами
class UserCourse(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='user_courses', on_delete=models.PROTECT)
course = models.ForeignKey(Course, related_name='course_user_courses', on_delete=models.PROTECT)
Я хочу получить все курсы, связанные с одним пользователем:
def courses(self):
from holos_apps.holos.models import Course
all_user_courses = self.user_courses.all().values_list('course', flat=True)
return Course.objects.filter(id__in=all_user_courses).distinct().order_by('schedule__day',
'schedule__start_time')
def active_courses(self):
return self.courses().exclude(active_status=0)
и все демонстрации, связанные с одним пользователем
def demos(self):
if self.user_type.name == 'PM':
return self.pm_demos.all().distinct().order_by('schedule__day',
'schedule__start_time')
return self.cf_demos.all().distinct().order_by('schedule__day',
'schedule__start_time')
, и я хочу объединить их, но следите за их порядком в этот день и время начала расписания.
def all_courses(self):
courses = self.active_courses()
demos = self.demos()
from itertools import chain
result_list = sorted(
chain(courses, demos),
key=lambda instance: instance.schedule.all.start_time)
return result_list
К сожалению, ключ на цепочке не работает на поле m2m. Любая идея, как я мог go о комбинировании этих наборов запросов?