Django查询:使用两个字段连接两个模型

3

我有以下模型:

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)
    ...

学术记录包含一系列课程,每个课程都有一种语言代码,而课程时间则包括课程和语言代码。

如何根据给定的“学术记录”获取与“学术记录”中的“学术记录课程”匹配的课程时间?

这是我的方法,但它比需要查询更多的内容:
# 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而不是原始SQL来查询

SubjectTime语言组必须与Subject的语言组匹配

2个回答

6

我明白了,部分感谢@Robert Jørgensgaard Eng的帮助。

我的问题是如何使用多个字段进行内连接,在此过程中F对象非常有用。
正确的查询语句为:

SubjectTime.objects.filter(subject__academicrecordsubject__academic_record=record,
                           subject__academicrecordsubject__language_group=F('language_group'))

“F”表达式确实是解决方案的关键。 - raner

5

给定一个 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 shell进行测试,那就更容易了 :)

SubjectTime语言也必须与academicrecordsubject的语言相匹配。 - Alejandro Garcia
现在我很抱歉错过了那个:)。正如你所指出的,models.F绝对是正确的选择。你刚刚给自己授予了50分吗:D - Robert Jørgensgaard Engdahl
不,我没有,我在等看看是否会有其他回复。我会给你悬赏。 - Alejandro Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接