2012-01-26 8 views
3

コメントモデルの任意のフィールド上)(異なる実行すると、常にdjangoコメントフレームワーク:distinct()は機能しませんか?

Comment.objects.values( 'ユーザ')の別個の()

[{ 'ユーザ'、すべてのレコードが返されます。1 {'user':1}、{'user':1}、{'user':0}、{'user':0}、{'user':0} 、{ 'ユーザ':1}、{ 'ユーザ':1}]

Comment.objects.values( 'IP_ADDRESS')異なる()

[{ '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。 {'ip_address':u'192.168.0.180 '}、{' ip_address ':u'192.168.0.180'}、 {'ip_address': 'ip_address':u'192.168.0.180 '}、 u'192.168.0.180 '}]

どうしてですか?これを回避する方法はありますか?ありがとう!

ps:distinct()は、テスト中にカスタムモデルのさまざまなタイプのフィールドで非常によく動作します。 Commentsフレームワークについて特別なことがありますか?いくつかの読書と組み合わせて、この質問に答えるという結論 おかげでみんなの

ビットは、私は次のような結論を得る:

  1. 値を()最終 SQLのSELECT部分​​でルックアップフィールドに影響を与える(」values() takes optional positional arguments, *fields, which specify field names to which the SELECT should be limited ")
  2. order_by()は、そのパラメータをSELECT部分​​にも追加します。このように見えるようにSQLを結果となるルックアップで()の異なる使用
  3. DISTINCT SELECT [fields1、fields2を、fields3] FROM ... WHERE ...

    フィールドの値がすべて一緒にレコードが一意であるかどうかを決定します。フィールドは、ルックアップのvalues()関数またはorder_by()関数から来る場合があります。

  4. So the order_by() is adding some unwanted effects when combined with distinct(), the fields specified in order_by is also take into consideration whether a record is unique

  5. Djangoのコメントは、このように全体の問題を作成し、デフォルトでは非表示ORDER_BYパラメータを持っています。 qを返すと、同じ問題が発生する可能性があります。

  6. 解決方法は、 の末尾に空のorder_by()を追加して、デフォルトのorder_byを削除します。

答えて

4
Comment.objects.values('user').distinct().order_by() 
+0

場合は、両方のあなたのソリューションは、すべての –

+0

@SimonKagwiでは動作しません。そして、彼らは何をすべきか戻りますか? – DrTyrsa

+0

こんにちはDrTyrsa!私はdjango 1.3を使用しており、distinct()のパラメータはこのバージョンでは説明されていません。 2番目のコマンドはコメントモデルでは機能しませんが、カスタムモデルではうまくいきます(PSで述べたようなものです)。 しかし、なぜ '値'は '明確な'動作に影響を与えるべきではありませんか? djangoにどの列の値をグループ化するべきかを伝えない場合、どのようにレコードを一意に扱うかをどのように知ることができますか? –

3

私は、これが原因であることを確認していませんが、Commentモデルはdistinct()方法に影響デフォルトの順序があります。

In [1]: print Comment.objects.values('ip_address').distinct().query 
SELECT DISTINCT "django_comments"."ip_address", "django_comments"."submit_date" FROM "django_comments" ORDER BY "django_comments"."submit_date" ASC 

それは、documented featureですが。

ここで、2つのコメントがまったく同じタイムスタンプを持つことはどうでしょうか?私はあなたが1秒未満をサポートしていないMySQLを使用していると思います。

そして、あなたはデフォルトの順序を取り除きたい場合は、単に実行します。OPは個別のユーザIDを探している

Comment.objects.order_by().values('ip_address').distinct() 
+0

ありがとう!コメントフレームワーク内の隠されたorder_byは、すべての問題の原因です。この場合、非常に望ましくない機能です。 –

+0

@ Xun:デフォルトの注文を取り除く方法を示すために私の答えを更新しました。 –

+0

ああ、申し訳ありませんが、私はあなたがすでにそれを考え出しているのを見ていません:) –

関連する問題