【问题标题】:how can I get data from a table that is liked to a table that is liked to another one it self?如何从一个喜欢的表格中获取数据,该表格喜欢另一个自己喜欢的表格?
【发布时间】:2020-04-22 01:32:11
【问题描述】:

我有三个表,result,course,study,如下所示

class Study(models.Model):
    id_study = models.IntegerField(primary_key=True)
    study_name = models.CharField(max_length=45)
    description = models.CharField(max_length=45, blank=True, null=True)
    language = models.CharField(max_length=45)
    number_of_years = models.CharField(max_length=45)

class Course(models.Model):
    id_course = models.AutoField(primary_key=True)
    course_name = models.CharField(max_length=45, blank=True, null=True)
    description = models.CharField(max_length=45, blank=True, null=True)
    credits = models.CharField(max_length=45, blank=True, null=True)
    teacher_id_teacher = models.ForeignKey('Teacher', models.DO_NOTHING, db_column='teacher_id_teacher')
    study_id_study = models.ForeignKey('Study', models.DO_NOTHING, db_column='study_id_study')

class Exam(models.Model):
    id_exam = models.AutoField(primary_key=True)
    room = models.CharField(max_length=45, blank=True, null=True)
    resit = models.CharField(max_length=45, blank=True, null=True)
    date = models.DateField(blank=True, null=True)
    time = models.TimeField(blank=True, null=True)
    course_id_course = models.ForeignKey(Course, models.DO_NOTHING, db_column='course_id_course')


class Result(models.Model):
    id_result = models.AutoField(primary_key=True)
    grade = models.IntegerField(blank=True, null=True)
    exam_id_exam = models.ForeignKey(Exam, models.DO_NOTHING, db_column='exam_id_exam')
    date = models.DateField(blank=True, null=True)
    student_id_student = models.ForeignKey('Student', models.DO_NOTHING, db_column='student_id_student')
    passed = models.CharField(max_length=45, blank=True, null=True)

我想根据我给出的 study_id 得到一个结果对象

成绩取决于考试,考试取决于课程,课程取决于学习

提前致谢

【问题讨论】:

  • Result -> Course 关系在哪里?
  • 我认为您将“取决于”与“是的孩子”混淆了。一章是一本书的孩子。给定一本书,您无法获得独特的章节。给定一章,您将拥有一本独特的书,它是其中的一部分。结果是我认为您的结果不是唯一确定的。对于一个学习对象,您将获得一组课程。即 study.course_set.all()
  • @IainShelvington 我刚刚纠正了我的问题 :)

标签: python mysql sql django django-models


【解决方案1】:

您可以使用双下划线表示法在查询中跟踪关系

Result.objects.filter(
    exam_id_exam__course_id_course__study_id_study__id=study_id
)

对于它的价值:你的外键有一个奇怪的命名约定,通常一个名为 Exam 的模型的外键将被命名为 exam,你已经为每个外键设置了 db_column,所以你不需要以这种方式命名它们。如果您将它们的名称更改为模型名称小写,它看起来像这样,可能更具可读性

Result.objects.filter(exam__course__study__id=study_id)

【讨论】:

  • 非常感谢,正是我需要的,在 sql 中是否也有相应的查询;)
  • 打印queryset.query会输出结果SQL -> print(Result.objects.filter(exam_id_exam__course_id_course__study_id_study__id=study_id).query)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多