【问题标题】:Using related_name correctly in Django在 Django 中正确使用related_name
【发布时间】:2012-08-23 08:32:11
【问题描述】:

我有两个使用 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 访问类的名称?需要一些指导。

【问题讨论】:

    标签: python django


    【解决方案1】:

    是的,类是管理者。一位老师可以上几节课。所以要输出他们的名字,你应该这样做:

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

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

    【讨论】:

    • 每个孩子只有一堂课。那为什么不 john.classes.name 呢?
    • 您的解决方案有效,但想知道为什么 john.classes.name 无效?
    • 因为 ForeignKey 为一个孩子制作了几个班级,而不是一个班级。如果您只想要一个类,请使用 onetoone 字段。
    • @lakesh 我已经改变了答案。
    • 另一个问题:由于类的 unicode 返回 self.name 我该如何使用它?不能和related_name一起使用吗?如果可能的话,我该怎么做?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以这样做来访问表中的第一行

      john = Student.objects.get(username = 'john')    
      john.classes.all().first().name # to access first row
      john.classes.all().last().name # to access last row
      

      在上面的示例中,您不想遍历对象

      它会在第一行给你类的名字

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        • 2013-09-14
        • 2013-09-27
        • 1970-01-01
        • 2012-09-04
        • 2018-10-02
        • 2019-02-06
        相关资源
        最近更新 更多