在 Django 中正确使用 related_name

新手上路,请多包涵

我有两个使用 ForeignKey 关联在一起的模型,并且使用了 related_name。这是一个例子。

 class Student(models.Model):
    name = models.CharField(max_length=255)
    birthday = models.DateField(blank=True)

class Class(models.Model):

    name = models.CharField(max_length=255)
    student = models.ForeignKey(Student,
                                related_name='classes',
                                null=True)

    def __unicode__(self):
        return self.name

例如,我想访问类名。

这是我试过的。

 john = Student.objects.get(username = 'john')
print john.classes.name

什么都没有打印出来。

但是当我尝试 john.classes

我在 0x109911410 处得到 django.db.models.fields.related.RelatedManager 对象。这表明它们是相关的。但我想获得班级名称。

难道我做错了什么?如何使用 related_name 访问类的名称?需要一些指导。

原文由 lakshmen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 570
2 个回答

是的,班级是经理。一个老师可以上好几节课。所以要输出他们的名字你应该这样做:

 john = Student.objects.get(username='john')
for class2 in john.classes.all():
   print class2.name

如果您只想为一个学生上一节课,请使用一对一关系。在这种情况下,您可以使用您的方法访问相关字段。

原文由 sergzach 发布,翻译遵循 CC BY-SA 4.0 许可协议

请注意:您正在定义一对多关系。因此,学生可以有多个班级,因此 john.classes.name 无法工作,因为您没有指定要为其命名的班级。在 john.classes 中,“classes”只是一个管理器,您可以像使用任何其他 Django 模型管理器一样使用它。您可以执行 john.classes.all()(如 sergzach 所提议的),但也可以执行 john.classes.get(…) 或 john.classes.filter(…) 之类的操作。

原文由 schacki 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题