2017-01-17 15 views
1

2つのフィールドに基づいてユニークな結果を取得した後、結果を並べ替えたいと思います。私が持っている問題は、私がDjangoで2つのorder_byを使うことができないということです。 Django clears the previous order_by() whenever you use this function.distinctを使用した後でorder_byを実行するにはどうすればよいですか?

各order_by()コールは以前の注文をすべてクリアします。

モデルの例:

class Product(models.Model): 
    price = models.FloatField() 
    name = models.CharField(max_length=100) 
    group = models.CharField(max_length=100) 

私は、同じグループにある製品を取得し、最低を持っていると思います。そして、価格で並べ替えたいと思います。このようなもの:

Product.objects.order_by('group','price').distinct('group').order_by('price') 
Product.objects.order_by('group','price').distinct('group').order_by('-price') 

事実は、最初の順序で使用すると別の製品が得られます。

-

EDITテーブルの

例:

id | name | group | price 
0 | aaa | aaa | 10.0 
1 | aaa | aaa | 1.0 
2 | aaa | aaa | 2.0 
3 | aaa | aaa | 1.0 
4 | bbb | bbb | 2.0 
5 | bbb | bbb | 2.1 
6 | bbb | bbb | 10.0 

価格で並べ替え:

1 | aaa | aaa | 1.0 
4 | bbb | bbb | 2.0 

- 価格で並べ替え:

4 | bbb | bbb | 2.0 
1 | aaa | aaa | 1.0 

私が問題にするのは、order_byを使用して並べ替えると返される商品が異なるということです。 SQL文で

はこのようなものになるだろう:私は[OK]をPostgreSQLの

+0

実際、私はあなたがここでやろうとしていることをかなり得られませんでした。取得しようとしているSQLクエリを提供できますか? –

+0

あなたはグループごとに最低価格を取得しようとしていて、価格で並べ替えられていますか? – SomeSillyName

+0

2番目の 'order_by'節を切ってしまうと、最初の' order_by'節の順序は保持されませんか? –

答えて

1

を使用してい

SELECT * 
FROM product 
WHERE id IN (
    SELECT DISTINCT ON 
    (group) id 
    FROM product 
    ORDER BY group ASC, price ASC 
) 
ORDER BY price DESC 

、ここで私がやったことです:

products = Product.objects.order_by('group','price').distinct('group') 
result = Product.objects.filter(id__in=products).order_by('-price') 

私はそれはないと思います最も効率的な方法ですが、それは働いています...

1

私は同じ問題があり、別の解決策を見つけました。明瞭に続いsorted_byとDBへの最初の要求後にすることができます:あなたはデータベースへの第2の要求を行っていないので、

import operator 

products = Product.objects.order_by('group','price').distinct('group') 
result = sorted(products, key=operator.attrgetter('price'), reverse=True) 

このソリューションは良いです。

関連する問題