Запрос Django: соединение двух моделей с двумя полями



У меня есть следующие модели:

class AcademicRecord(models.Model):
    record_id = models.PositiveIntegerField(unique=True, primary_key=True)
    subjects = models.ManyToManyField(Subject,through='AcademicRecordSubject')
    ...


class AcademicRecordSubject(models.Model):
    academic_record = models.ForeignKey('AcademicRecord')
    subject = models.ForeignKey('Subject')
    language_group = IntegerCharField(max_length=2)
    ...


class SubjectTime(models.Model):
    time_id = models.CharField(max_length=128, unique=True, primary_key=True)
    subject = models.ForeignKey(Subject)
    language_group = IntegerCharField(max_length=2)
    ...


class Subject(models.Model):
    subject_id = models.PositiveIntegerField(unique=True,primary_key=True)
    ...

В академических отчетах есть список предметов, каждый из которых имеет код языка, а в предметных расписаниях есть код предмета и языка.

С заданным AcademicRecord, как я могу получить время субъекта, которое совпадает с AcademicRecordSubjects, которое имеет AcademicRecord?

Это мой подход, но он делает больше запросов, чем нужно:

# record is the given AcademicRecord
times = []
for record_subject in record.academicrecordsubject_set.all():
    matched_times = SubjectTime.objects.filter(subject=record_subject.subject)
    current_times = matched_times.filter(language_group=record_subject.language_group)
    times.append(current_times)

Я хочу сделать запрос с помощью django ORM, а не с raw SQL

SubjectTime языковая группа должна соответствовать Subject ' s языковая группа А

41   2  

2 ответов:

Я получил его, отчасти благодаря @Robert Jørgensgaard Eng

Моя проблема состояла в том, как выполнить внутреннее соединение, используя более чем 1 поле, в котором объект F появился вручную.
Правильный запрос:
SubjectTime.objects.filter(subject__academicrecordsubject__academic_record=record,
                           subject__academicrecordsubject__language_group=F('language_group'))

Учитывая AcademicRecord экземпляр academic_record, это либо

SubjectTime.objects.filter(subject__academicrecordsubject_set__academic_record=academic_record)

Или

SubjectTime.objects.filter(subject__academicrecordsubject__academic_record=academic_record)

Результаты отражают все строки соединения, которые эти запросы ORM становятся в SQL. Чтобы избежать дублирования, просто используйте distinct().

Теперь это было бы намного проще, если бы у меня была оболочка django для тестирования:)

    Ничего не найдено.

Добавить ответ:
Отменить.