Django外键查询集(连接)

3

我正在学习Django,并试图仅使用Django ORM函数通过外键获取值。 我有两个表:用户表(默认的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

我希望通过 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

我收到了一个错误,说User对象没有属性(这是有道理的,因为nr_indeksu在Student模型中,但我应该能够从User中获取它吗?)

3个回答

5

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


1
关于“每个学生有很多用户”的问题,这应该被反转,这里每个学生只与一个用户相关,而每个用户可能有很多学生。 - gary

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()

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


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

s.nr_indeksu

问题是我想使用JOIN和FK关系从User模型中获取nr_indeksu,而你的答案只是从Student模型中简单地SELECT WHERE。 - Malyo
1
不是的。user__id=2 意味着 Select * from USER where user_id=2;。这就像一个子查询。 - Joyfulgrind
好的,我明白了,谢谢 - 但是我仍然想从用户对象访问学生属性。 - Malyo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接