2

django をいじるのに忙しいのですが、つまずくようなことが 1 つあります。現在、私は SQL の記述に多くの経験を積んでいるので、問題を解決することができます。ORM が存在しない場合は結果を返します。

基本的に、これは私が返したいSQLクエリです

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

私のモデルクラスは次のように定義されています:

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)

私は、django Web サイトのクエリセット、モデル、およびビューのドキュメントとリファレンスを確認しました。しかし、これを行う方法についてはまだ明確ではありません。

また、一般的なリスト ビューで URL を設定しましたが、テンプレートの 2 番目のテーブルからuser_nameフィールドにアクセスしたいと考えています。urls.py とシェル経由でselect_relatedを試しましたが、うまくいかないようです。以下の例を参照してください。

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 つのテーブルからテンプレートにフィールドを渡す最良の方法は何ですか (したがって、両方のテーブルのフィールドにアクセスできます)
  • これは一般的なビューで行うことができますか?
4

2 に答える 2

4

このようなものが動作するはずです:

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

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

于 2009-08-05T09:49:30.600 に答える
2

select_related() は、2 番目のテーブルの結果をクエリに直接追加するのではなく、単に "ロード" するだけで、遅延して提供するのではありません。サイトのパフォーマンスを向上させることができると確信している場合にのみ使用してください。2番目のテーブルを取得するには、書く必要があります

a.user.username

Django で関連テーブルを取得するには、設計した外部キ​​ーを使用してそれらをたどる必要があります。クエリ自体は「遅延」であるため、SQL クエリに直接変換されません。必要なときにだけ、必要な SQL だけを実行します。

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

于 2009-08-05T09:50:13.530 に答える