2017-03-07 16 views
-2

Djangoを回避する方法を模索しています。私はDjangoアプリケーションで2つのモデルを作成しました。1対多関係のDjangoテーブルからの関連フィールドの照会

from django.db import models 

#first model 
class Person(models.Model): 
    name = models.CharField(max_length=40) 
    email = models.CharField(max_length=100) 
    title = models.CharField(max_length=100) 
    image = models.CharField(max_length=200) 

    def __str__(self): 
     return self.name 

#second model 
class Skill(models.Model): 
    person = models.ForeignKey(Person) 
    skill = models.CharField(max_length=60) 
    years = models.CharField(max_length=40) 

    def __str__(self): 
     return self.skill, self.person 

最初のモデルは、人であり、第2のモデルは、スキルあります。さて、この関係は、それぞれの人が多くのスキルを持つことになります。

私はデータでデータベースを更新できます。サイトの管理セクションも正常に動作します。 Djangoのシェル上

、私はコマンドを実行しよう:

Skill.object.all() 

と私は何を取得するには、次のエラーです:

Traceback (most recent call last): 

File "<console>", line 1, in <module> 
    File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\models\query.py", line 235, in __repr__ 
    return '<QuerySet %r>' % data 
    File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\models\base.py", line 572, in __repr__ 
    u = six.text_type(self) 
TypeError: __str__ returned non-string (type tuple) 

または私はコマンドを実行してください場合:

Skill.objects.get(pk=1) 

i:

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\models\base.py", line 572, in __repr__ 
    u = six.text_type(self) 
TypeError: __str__ returned non-string (type tuple) 

私は、次のようなコマンドを実行するただし場合:「Photoshopの」私はスキルを持っている人の名前を取得

Skill.objects.get(skill='Photoshop').person.name 

ここで間違っていることを理解しようとしています。おそらく私はこの方法で外部キーを持つテーブルをクエリするはずがありませんか?または、私は何か間違っているかもしれません。

最後に質問したいのは、特定の名前または主キーを持つPersonのすべてのスキルを探したいと思っています。

+1

には、上記のコードは、コピーが貼り付けられますが、よろしいですか? skill_set.all() ' – itzMEonTV

+0

はいコードはコピー貼り付けされていますが、そこにはありません。 'return self.skill'の末尾にカンマがありません:( –

+0

@itzmeontv残念ながらカンマがありましたが、実際にはカンマを削除して試しましたが、シェルを終了するまで変更が適用されなかったと思いますとにかく、コンマでどのようにコードを更新したのですか? –

答えて

1

__str__は、strを返す必要があります。だから、

return "%s-%s" %(self.skill, self.person.name) 
+0

ああ、ありがとう、私はちょうど私が人の情報を維持する必要があった場合私はそれを修正する方法を尋ねるつもりだった。 –

1

あなた__str__方法は、タプル(self.skill、self.person)を返すには、この

return self.skill, self.person 

のようなものを変更し、それはそれらのオブジェクトのstrの表現を返さなければなりません。それを達成するために、変更:

return self.skill, self.person 

return "{}, {}".format(self.skill, self.person) 
+0

説明してくれてありがとう、今私はそれを理解しています:) –

+0

Djangoを探検する幸運:) –