2009-08-05 10 views
0

Djangoで遊んでいるうちに外出しているようですが、今、私はSQLを書くのにたくさんの経験があるので、私はprobすることができます。 ORMがなければ結果を返します。私はクエリセット、モデルや意見のドキュメントおよび参照をしてきたDjango - 外部キー関係に従う(つまり、SQLでJOIN)

class Table1(models.Model): 
    #other fields 
    text  = models.TextField() 
    user  = models.ForeignKey('table2') 

class Table2(models.Model): 
    # other fields 
    user_name = models.CharField(max_length=50) 
    url = models.URLField(blank=True, null=True) 

は、基本的には、この私が欲しいSQLクエリは

Select 
    table1.id 
    table1.text 
    table1.user 
    table2.user_name 
    table2.url 
from table1, table2 
where table1.user_id = table2.id 

私のモデルクラスとして定義されている返されますdjangoのウェブサイトしかし、それはまだこれを行う方法については明確ではありません。

URLを汎用リストビューで設定しましたが、テンプレートの2番目のテーブルのフィールドのにアクセスしたいとします。私はselect_relatedをurls.pyで試してみましたが、シェルを介しても動作していないようです。以下の例を参照してください。

シェルでURLでのコンフィグ

url(r'^$','django.views.generic.list_detail.object_list', { 'queryset': Table1.objects.select_related() }), 

>>> a = Table1.objects.select_related().get(id=1) 
>>> a.id 
1 
>>> a.user_name 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'Table1' object has no attribute 'user_name' 

だから基本的には、

  • は私が間違って何をしているのですか?
  • 何か不足していますか?
  • 同じクエリーセット内の2つのテーブルのフィールドをテンプレートに渡す最適な方法は何ですか(両方のテーブルのフィールドにアクセスできるように)
  • これは一般的なビューで行うことができますか?
  • このような何かが動作するはず
+0

ああ、気が滅茶苦茶だった。あなたのテンプレートに関連するフィールドを含めるには、 {{object.id。<フィールドfrom Table2> – ismail

+0

はあなたのテンプレートに明記してください。 {{オブジェクト。<外部キーID>。<テーブル2のフィールド> }} – ismail

答えて

3

u = Table1.objects.get(id=1) 
print u.id 
print u.user.user_name 

あなたが外部キーをフォローしたい場合は、明示的にそれを行う必要があります。 Table1からオブジェクトを取得すると、自動結合は行われません。この例のユーザーである外部キーフィールドにアクセスすると、Table2のオブジェクトしか取得されません

+0

ありがとう、それは働いたようです。ドキュメントに従って、select_relatedオプションはクエリ(クエリを含む)全体を返します(結合を含む)。 URL設定にすべてのフィールドを含めるにはどうすればよいですか? – ismail

+0

私はselect_relatedをまだ必要としていません - freiksenetが書いたように、パフォーマンスを向上させる必要がある場合は提供されます。 また、なぜあなたはすでにURLにフィールドを置く必要がありますか?ビューで必要なものを検索してみませんか? – gruszczy

+0

感謝の男...それは働いている。今私は二人のように感じる! あなたの回答が助けになりました! – ismail

2

select_related()2番目のテーブルの結果をクエリに直接追加しないでください。あなたに怠け者を与える。サイトのパフォーマンスを向上させることができると確信しているときにのみ使用してください。第二のテーブルを取得するには、あなたが設計している外国のキーを介してそれらを実行する必要があり、関連テーブルを取得するためにはDjangoで

a.user.username 

を記述する必要があります。クエリー自体は「怠け者」であるため、SQLクエリーに直接変換されません。必要なときにのみ、必要なときにのみSQLを実行します。

select_relatedがある場合は、元のクエリaを実行した時点でSQLが実行されています。しかし、select_relatedがなければ、実際にa.user.usernameを実行するときだけDBをロードします。

関連する問題