Model.objects.get()有效,但在使用ForeignKey属性时无效

时间:2017-01-29 09:39:35

标签: python django django-models django-views

我有一个如下所示的个人资料模型:

class Profile(models.Model):
    username = models.ForeignKey(User, blank=True, null=True)
    age = models.IntegerField(default=0)
    points = models.IntegerField(default=100)

    def __str__(self):
        return str(self.username)

这是我的模板

<h3><a href="{% url 'profile' u=i.user %}" class='username_foreign'>{{ i.user }}</a></h3>

指向此网址:

url(r'^profile/(?P<u>\w+)/', profile, name='profile')

以及我的观点功能:

def profile(request, u):
    if request.method == 'GET':
        profile = Profile.objects.get(username=u)

    return render(request, 'base.html', {})

正如您在此处所见,我通过u这是用户名。但是,当我尝试get()通过profile通过username时,我收到此错误:

ValueError at /profile/zorgan/

invalid literal for int() with base 10: 'zorgan'

但是当我在get()模型的任何其他属性上使用Profile时,它运行正常。它甚至打印我的username。所以当我这样做时:

def profile(request, u):
    if request.method == 'GET':
        print(u) #prints username
        profile = Profile.objects.get(points=50)
        print(profile.username) #successfully prints username (same as 'u')

    return render(request, 'base.html', {})

正如您在上面所看到的,通过其属性获取Profile对象并不适用于username。问题与成功打印的u无关。知道问题是什么吗?

1 个答案:

答案 0 :(得分:4)

您调用的字段username根本不是用户名。它是一个ForeignKey,它是一个指向另一个表中一行的整数值。你应该把它称之为:user

要查找实际用户名,请在User表中使用双下划线语法。这可行:

profile = Profile.objects.get(username__username=u)

但正如我所说,你应该真正重命名username字段,在这种情况下你会这样做:

profile = Profile.objects.get(user__username=u)

另一种方法是直接查找用户,然后获取个人资料:

user = User.objects.get(username=u)
profile = user.profile

但这需要两个单独的查询,而不是一个查询。