django 使用distinct后如何执行order_by?

8yparm6h  于 2023-08-08  发布在  Go
关注(0)|答案(4)|浏览(124)

我想排序我的结果后,我已经抓住了两个领域的基础上独特的结果。我遇到的问题是我不能在Django中使用两个order_by。每当你使用这个函数时,Django会清除之前的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')


事情是,如果只是使用在第一个订单由我得到不同的产品。

编辑

表格示例:

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


按价格排序:
按价格排序:

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


我遇到的问题是,当我使用order_by排序时,返回的产品是不同的。
在sql语句中,应该是这样的:

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


我用的是PostgreSQL

wz8daaqr

wz8daaqr1#

好吧,这是我做的:

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

字符串
我不认为这是最有效的方法,但它是工作...

2q5ifsrm

2q5ifsrm2#

我遇到了同样的问题,找到了另一个解决方案。在第一次使用sorted_by后跟distinct请求数据库之后,您可以:

import operator

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

字符串
这种解决方案更好,因为您不会向数据库发出第二个请求。

wydwbb8l

wydwbb8l3#

我喜欢 Alexandria 使用sorted的想法。我将排序函数放入models.QuerySet的子类中,然后相应地设置ProductManager。这允许您将sorted方法链接到您的查询集。

**Gotcha:**返回列表而不是查询集,所以排序后不能使用任何查询集方法。
**相关模型字段排序:**通过点运算符传递一个跨越查找范围的键(key ='price.other'),可以按照相关模型字段进行排序

manager.py
class ProductQuerySet(models.QuerySet):
    def sorted(self, key, reverse=False):
        """ Returns a list (rather than queryset) of Djano model instances """
        return sorted(self, key=operator.attrgetter(key), reverse=reverse)

    def current(self):
        return self.order_by('group', 'price').distinct('group')

class ProductManagerBase(models.Manager):
   pass

ProductManager = ProductManagerBase.from_queryset(ProductQuerySet)

models.py
...
objects = ProductManager()

字符串

**查询

qs = (Product
     .current()
     .sorted('price', reverse=True))

pbpqsu0x

pbpqsu0x4#

”这就是我是怎么做的!所以我执行子查询。**

  • 内部查询是按照order by和distinct* 运行的,基于你需要的值是distinct**,外部查询是对你想要的列进行排序**。
    **请记住,这是一个示例代码。把它变成你需要它做的事情。它对我有用,也可能对其他人有用。

样本代码:

from django.db.models import Subquery

    queryset = models.Products.objects.filter(
        pk__in=Subquery(
            models.Products.objects.filter(
               filter1=filter1,
               filter2=filter2,
               filter3=filter3
              ).order_by(
               'group'
              ).distinct(
              'group'
              ).values('pk')
           )
        ).order_by('-price')

字符串

相关问题