2017-08-19 37 views
2

のセットからオブジェクトを返すためにselect_related使用して、私は市のモデルにforiegnkeyを持っているArticlePageモデルを持っている、と私は効率的にすべて含むmodels.Cityのセットを取得するクエリセットを使用したいですArticlePageによって参照されているCityインスタンス。Djangoのクエリセット:外部キー

class ArticlePage(Page): 
    #... 
    city = models.ForeignKey(City, on_delete=models.PROTECT, null=True) 
    #... 

は、次にビューで:

qs = ArticlePage.objects.filter(city__isnull=False).filter(city__name__icontains=self.q).select_related('city') 

だから私は、上記のクエリの多くの順列を試してみた、そしてそれらのどれも望ましい結果を返しません。すべての結果は、Cityの代わりにArticlePageタイプのセットです。

私がしようとしているのは、ArticlePageによって参照されるすべてのCityオブジェクトを含むCityタイプの結果のセットを返すことですが、これはジャンゴクエリーセットで起こるようにしようとして狂ってしまいます。私はちょうど非常にばかげた何かをやっていると確信ここでアドバイスをお待ちしています。

+1

を助ける願っていますあなたが 'City'インスタンスを望むなら、なぜ' City'の代わりに 'ArticlePage'をクエリしていますか? – knbk

+0

あなたが同意する場合、私は、最初の文を他の人に容易に検索可能なものへの質問の名前を変更し、編集することをお勧めします。私は、まだ(または重複して)似たような質問があるはずだと信じていますが、誰も簡単に見つけられず、あなたの質問は役に立ちます。 – hynekcer

+0

は、私はうまくいけば、それはよりよい言葉で表現することができれば、私に知らせて、より検索可能にタイトルと最初の文を更新した、以下の答え。 – Cerzi

答えて

3

select-related、単にキャッシュされた関連オブジェクトあなたがCityのクエリセットを必要とする場合、あなたはsomethigのように、あなたに適量を書き換える必要があります。

qs_a = ArticlePage.objects.filter(city__isnull=False).values_list('city__pk', flat=True) 
qs = City.objects.filter(name__icontains=self.q, pk__in=qs_a) 

は私が完全に何を理解していないことが

+1

'qs_a'は怠惰が実行されたクエリセットであるとの両方のクエリセットを1つのSQLコマンドにコンパイルされているので、でも別に、この場合に実行されることはありませんので、これは、最適なソリューションです:' IDを選択し、... app_city FROM WHERE名LIKE 「...」とIDありがとう ' – hynekcer

+0

(CITY_IDがNULLではありませんapp_articlepage FROM CITY_IDを選択)では、それは私がもともと欠場するがうまく管理したいpk__inの引数でした! – Cerzi

関連する問題