2017-01-29 26 views
0

我有一個輪廓模型,看起來像這樣的時候:Model.objects.get()的作品,而不是使用一個ForeignKey屬性

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這是用戶名。但是,當我通過username穿過嘗試get()profile,我得到這個錯誤:

ValueError at /profile/zorgan/ 

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

然而,當我在我的Profile模型的任何其他屬性使用get(),它工作正常。它甚至打印我的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無關,因爲它可以成功打印。任何想法是什麼問題?

回答

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 

但這需要兩個單獨的查詢,而不是一個加入一個。

+0

非常感謝Thankyou解決問題。我不太熟悉double __語法,所以你可以給出一個簡短的總結或者指出我解釋它的地方?爲什麼它用於ForeignKey字段而不用其他字段? – Zorgan

+1

因爲用戶名值是*在另一個模型*,即用戶。 –

相關問題