Django, объединить два набора запросов и отсортировать их по общему полю m2m - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть две модели:

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 о комбинировании этих наборов запросов?

1 Ответ

0 голосов
/ 26 апреля 2020

Мой вопрос не имел большого смысла. Если есть поле m2m, один экземпляр можно связать, скажем, с двумя экземплярами в поле m2m. В таком случае, как вы узнаете, какой экземпляр поля m2m выбрать, чтобы упорядочить список? Мы могли бы выбрать первый, но он не дал бы того, что мне нужно.

Я переосмыслил проблему и понял, что список, который я хочу выпустить, не является одним из курсов, упорядоченных по их временным интервалам, но один из временных интервалов. Ie список экземпляров класса m2m.

Редактировать: фактически, если я возвращаю список экземпляров этого расписания, я не имею отношения к экземпляру курса. Так что, вероятно, тоже не правильное решение. Я пойму это, хотя

...