在Django中使用ForeignKey的麻烦

时间:2016-03-14 16:33:38

标签: python django

我有这样的模特:

class Subject(models.Model):
    name = models.CharField(unique=True, ...)

class Curriculum(models.Model):
    name = models.IntegerField(unique=True, ...)
    subjects = models.ManyToManyField(Subject)

class Grade(models.Model):
    name = models.CharField(unique=True,...)
    curriculum = models.ForeignKey(Curriculum, ...)

如果我知道成绩的具体实例的名称,我如何获得与成绩课程相关联的科目列表。我尝试过以下内容:

curriculum = Grade(name=grade).curriculum
subjectsqueryset = curriculum.subjects

但收到例外

  

django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist:成绩没有课程。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

如果数据库中有一个具有已知名称的Grade对象。然后你可以使用:

过滤
obj = Grade.objects.get(name=grade)
# access curriculum
obj.curriculum
# get subjects
obj.curriculum.subjects.all()

您在做什么是使用Grade创建name=grade的实例。但这还不在数据库中,你没有设置curriculum属性。这就是你获得RelatedObjectDoesNotExist的原因。

答案 1 :(得分:0)

您无法使用此行访问现有Grade

curriculum = Grade(name=grade).curriculum

您正在创建一个Grade - 新对象,其name值为grade。这不是你想要的。

使用

my_grade = Grade.objects.get(name=grade)
my_grade.curriculum # or whatever ...

使用现有对象。

如果要创建新对象,必须在访问任何相关对象之前保存它。

答案 2 :(得分:0)

grade = Grade.objects.get(id=id) # grade instance
curriculum = grade.curriculum # curriculum is a Foreign Key
subjects = curriculum.subjects.all() # subjects is a ManyToManyField
for subject in subjects:
    print subject # each subject of curriculum