Django外键QuerySet(加入)

时间:2013-09-22 09:49:15

标签: python django orm foreign-keys

所以我正在学习Django并试图通过仅使用Django ORM函数来获取外键值。我有2个表:用户表(默认Django auth_user系统表)和包含student_id,user_id(FK)和nr_indeksu的学生表(这是一个包含学生特定信息的附加信息的数字)。

class Student(models.Model):
    user = models.ForeignKey(User)
    nr_indeksu = models.BigIntegerField()

    def __unicode__(self):
        return unicode(self.user

我想通过用户模型获取nr_indeksu。换句话说,执行此查询(使用QuerySet):

SELECT nr_indeksu FROM auth_user
INNER JOIN courses_student on auth_user.id = courses_student.user_id;

我尝试过使用select_related()函数:

u = User.objects.select_related().get(pk=2)

但是当我尝试访问nr_indeksu时:

u.nr_indeksu

我收到用户对象没有属性的错误(这是有道理的,因为nr_indeksu在学生模型中,但我不能从用户那里获取它?)

3 个答案:

答案 0 :(得分:5)

记住ForeignKey是一对多的关系:每个学生都有很多用户。从用户对象,您可以通过user_obj.student_set.all()访问相关学生。

答案 1 :(得分:2)

添加到Daniel的答案中,您还可以使用related_names,现在当您必须执行反向外键查找时,您需要写: -

user_obj.student_set.all()

但是,使用related_name属性,模型将如下所示: -

class Student(models.Model):
    user = models.ForeignKey(User, related_name='studentuser')
    nr_indeksu = models.BigIntegerField()

    def __unicode__(self):
        return unicode(self.user

然后进行反向查找,你需要写: -

user_obj.studentuser.all()

基本上,我的意思是,你可以通过传递related_name属性为反向查找提供自己的名称,如果你不想使用django使用的默认名称,通常是表格<foreign_key_name>_set例如。在你的情况下,它是student_set

答案 2 :(得分:0)

s =  Student.objects.get(user__id=2)

s.nr_indeksu