2017-01-29 4 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:

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しようとする。しかし、私はこのエラーを取得する:私は私のProfileモデルの他の属性にget()を使用する場合

ValueError at /profile/zorgan/ 

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

はしかし、それが正常に動作します。そしてそれは私の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', {}) 

あなたがusernameのために動作しません。その属性を経由してProfileオブジェクトを取得し、上記の見ることができるように。問題は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 

しかし、これは1つの結合されたものではなく2つの別々のクエリをとります。

+0

問題を解決してくれてありがとうございました。私はあまりにもダブル__構文に精通していないので、あなたは簡単な要約を与えるか、それを説明するどこかで私を指摘することができますか?なぜForeignKeyフィールドに使用され、他のフィールドには使用されないのですか? – Zorgan

+1

ユーザ名の値が別のモデル*、つまりUserであるため*です。 –

関連する問題