コメントモデルの任意のフィールドでdistinct()を実行すると、常にすべてのレコードが返されます。
Comment.objects.values('user')。distinct()
[{'user':1}、{'user':0}、{'user':0}、{'user':0}、{'user':0}、{'user':1}、{ 'user':1}、{'user':1}、{'user':1}]
Comment.objects.values('ip_address')。distinct()
[{'ip_address':u'127.0.0.1'}、{' ip_address':u'192.168.0.180'}、{'ip_address':u'192.168.0.180'}、{' ip_address':u'192.168.0.180 '}、{' ip_address':u'192.168.0。180'}、{' ip_address':u'192.168.0.180'}、{'ip_address':u'192.168.0.180'}、{' ip_address':u'192.168.0.180'}、{'ip_address':u ' 192.168.0.180'}]
なぜこうなった?これを回避する方法はありますか?ありがとう!
ps:distinct()は、テスト中にカスタムモデルのさまざまなタイプのフィールドで非常にうまく実行されます。コメントフレームワークについて何か特別なことはありますか?
結論のビット この質問に答えてくれた皆さんに感謝します。いくつかの読み物と組み合わせると、次のように結論が得られます。
- values()は、最終的なsql( "のSELECT部分のルックアップフィールドに影響を与えます。values ()は、オプションの位置引数* fieldsを取ります。これは、SELECTを制限するフィールド名を指定します")
- order_by()は、そのパラメーターをSELECT部分にも追加します。
ルックアップでdistinct()を使用すると、SQLは次のようになります。
SELECT DISTINCT [fields1、fields2、fields3] FROM ... WHERE .. ..
そして、フィールドの値がすべて一緒になって、レコードが一意であるかどうかを決定します。フィールドは、ルックアップのvalues()またはorder_by()関数から取得できます。
したがって、order_by()は、distinct()と組み合わせると、いくつかの不要な効果を追加します。order_byで指定されたフィールドは、レコードが一意であるかどうかも考慮されます。
Django Commentにはデフォルトで非表示のorder_byパラメーターがあるため、問題全体が発生します。qsを返すときに、どのモデルにもorder_byが隠されていると、同じ問題が発生する可能性があります。
- これを解決する方法は、ルックアップの最後に空のorder_by()を追加することです。これにより、デフォルトのorder_byが削除されます。