2016-08-23 39 views
0

私はdistinct()Detangetを使用してDjangoでデータを取得しています。
私の最初のクエリはPoint.objects.order_by('chron', 'pubdate')でした。
場合によってはフィールドchronが重複しているので、重複を除外するために をPoint.objects.order_by('chron', 'pubdate').distinct('chron')に変更しました。 問題は、すべての空のフィールドが重複と見なされることです。Djangoで重複を除外するクエリ

正確には、chronフィールドには整数(idsに似た動作をします)が含まれています。場合によっては重複することもあり、場合によってはNULLになることもあります。

| chron | 
|-------| 
| 1  | I want this 
| 2  | I want this 
| 3  | I want this 
| 3  | 
| NULL | 
| 4  | I want this 
| NULL | 

は、私はすべてのchron重複を除外したいが、彼らはNULLの重複している場合ではありません。 ありがとうございます。

+0

これをチェックします。 https://stackoverflow.com/questions/30084107/django-query-with-order-by-distinct-and-limit-on-postgresql除外してnullの結果をフィルタリングします。 – Windsooon

答えて

2

2つの個別のクエリを使用します。 chron__isnull=Trueのみchron値について

  • .distinct("chron").exclude(chron__isnull=True)

  • .filter()

これは私が(私は喜んで修正されます)と信じてかなり非効率的なようだが、それさえも任意の賢明なバニラのSQL文(例。以下)ヌルと一意の値の結果セットに参加するために、複数のテーブルスキャンを必要とします。

SELECT * 
FROM (
    SELECT chron 
    FROM Point 
    WHERE chron IS NOT NULL # .exclude() 
    GROUP BY chron # .distinct() 

    UNION ALL 

    SELECT chron 
    FROM Point 
    WHERE chron IS NULL # .include() 
) 
+0

なぜ 'SELECT DISTINCT'の代わりに' GROUP BY'を使うのですか? –

+0

おかげさまで、chron__is_nullではなくchron__isnullと少し調整していましたが、 'chron'は' IntegerField'だと思います。 – isar

+0

訂正された構文で回答を更新します。質問に回答したことを必ずマークしてください。 – Matt

関連する問題