3

所以我正在学习 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 在学生模型中,但我不应该能够从用户那里获取它吗?)

4

3 回答 3

5

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

于 2013-09-22T10:35:02.183 回答
2

添加到丹尼尔的答案中,您还可以使用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

于 2013-09-22T11:57:42.627 回答
0
s =  Student.objects.get(user__id=2)

s.nr_indeksu
于 2013-09-22T10:01:26.823 回答