我有这样的模特:
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
:成绩没有课程。
我做错了什么?
答案 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