2012-05-11 6 views
0

私はこのコードのビットとDBの照会しようとした:多対多オブジェクトのすべてのインスタンス名を取得しますか?

Makesite.objects.values_list('ref_id', flat =True) 

それは[1,2、なし]返されます。私は中程度に混乱していることが分かった。私は、Pythonがインスタンスをインスタンス名で保存したと仮定しました。 Pythonがコードとしてそれらの名前を保存する理由とその名前ではなく、コードまたは説明の助けを借りてくれてありがとうございます。 models.py

class Makesite(models.Model): 
    sitename = models.CharField(max_length=100, unique = True) 
    siteinfo = models.ManyToManyField(Siteinfo) 
    ref_id = models.ManyToManyField(RefID) 
    report = models.ManyToManyField(Report) 

+0

'Makesite'はどのように見えますか? 'sitename'フィールドとは何ですか? – San4ez

+0

私はいくつかのモデルのコードをそこに投げたことをうまくいけばそれはあなたが探していたものだ – city

+0

また、私は間違ったコードをコピーした変数名を編集 – city

答えて

1

Djangoは彼らの "名前" でM2Mを保存しません。主キー(あなたの場合は整数)を使います。 DBテーブルを表示することでチェックすることができます。

makesite.sitenameのようなものを使用すると、Djangoはsitenameインスタンスをフェッチするためにどちらかのクエリを作成します。

values_listを使用すると、余分なクエリや結合が必要ないため、Djangoはデータを単一のテーブルから返します。それにフォームを得ることができるものは、すべてプライマリキーです。

関連するクエリを最適化する場合は、select_related/prefetch_relatedメソッドを参照するか、キャッシングを使用してください。

+0

よかった。だから私はこのようなコードを使用するときどのようなインスタンスを使用するのか知っていますか? 'Makesite.objects.get(サイト名=サイト).ref_id.values_list( 'refid'、flat = True)'。ここで、siteはインスタンスの名前です。 – city

+0

@city最初にジョインした後、ジョインされたリレーションのすべての 'refid'が返されます。 [django-debug-toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar)は、Djangoが作成したSQLクエリを調べるクールなツールです。それはより明確になります。 – DrTyrsa

+0

大丈夫です。これらの主キーをインスタンス名に変換する方法はありますか? – city

関連する問題