2012-06-01 14 views
38

私は明確な外部キーのリストを取得しようと、私はこれを書いた取得:Djangoのモデル - 個別の値リスト

my_ids = Entity.objects.values('foreign_key').distinct() 

をしかし、私はUNDISTINCT外部キーだけのリストを取得...私は何をしないのですか?

ありがとうございます!

答えて

28

これはヒントです!

:この1つは、単に一つのオブジェクトを働き、リターン(私の知る限り)

をどちらのソリューションは、文句を言わない、100%の仕事...しかし、私は一種のそれらを組み合わせた:)

のMySQL-データベースに対して明確なdoesntの仕事に引数を渡します

Entity.objects.order_by('foreign_key').values('foreign_key').distinct()

しかし、おかげでとにかく:)

+4

私は同じ問題をPostgres9.1データベースで持っています、Django == 1.5.5。追加order_by助けられた - 愚かな... – kev

31

おそらく、あなたはこれで行きたいかもしれません:

Entity.objects.order_by().values_list('foreign_key', flat=True).distinct() 
+7

WRONG。 order_by( 'foregin_key')なしで使用すると動作しません。例えばM2M(postgres、django 1.8)の – andi

3
Entity.objects.order_by('foreign_key').distinct('foreign_key') 

をすでにリストとしてそれらを持っている場合は、個別の値を取得するためにset()に変換します。

+0

ではset()と同じようにメモリに関してはコストがかかりますが、すべてがメモリに格納されますが、クエリセットとしては評価されるまでロードされません。リストのものはクエリーセットを評価するでしょうか? –

15
Entity.objects.values_list('foreign_key', flat=True).distinct().order_by() 

によって実行順序で動作していない明確な

order_by()呼び出しで使用されるフィールドはすべて、SQL SELECT 列に含まれています。これにより、distinct()と の組み合わせで使用すると、予期しない結果になることがあります。関連する モデルのフィールドで注文した場合、それらのフィールドは選択された列に追加され、 とすると、重複する行が区別されて表示されます。余分な 列は返された結果に表示されないため( のサポート注文にのみ)、ときどき が返されているように見えます。

は同様に、 は、選択した列を制限するためにあなたが値を使用している場合()クエリ、任意のORDER_BYで使用される列()(またはデフォルトのモデル 順序は)まだ関与することになりますと 結果の一意性に影響を与える可能性があります。

distinct()を使用している場合は、関連するモデルで の注文に注意してください。同様に、distinct()と values()を一緒に使用する場合は、 values()コールに含まれていないフィールドで並べ替えるときは注意が必要です。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct

+0

もう少し詳しく教えていただけますか?この質問の投票率を考えると、これは多くの人々の問題です。それを言うあなたの源は何ですか? –

+0

私はほとんど私の心を失った。このソリューションをありがとう! – Crystal

関連する問題