【问题标题】:ProgrammingError: when using order_by and distinct together in djangoProgrammingError:在 django 中同时使用 order_by 和 distinct
【发布时间】:2014-09-11 23:11:46
【问题描述】:

我有一个像下面这样的模型

class ProductScore(models.Model):
    client = models.ForeignKey(User)
    created = models.DateTimeField(default=datetime.datetime.now)
    score = models.IntegerField()
    scale = models.ForeignKey(Product) 

截至目前,我正在使用以下查询从上述模型中过滤掉重复项

scores = ProductScore.objects.filter(client=request.user).distinct('scale')

通过上面的查询,它返回了唯一的结果,但是很旧(创建日期很旧),我的意思是,例如,如果上面的表 ProductScore 有 10 条重复记录,其中 5 条是昨天创建的,5 条是昨天创建的它们是今天创建的,上面的查询返回的是昨天创建的 5 条唯一记录。

但我想要最近创建的记录(即今天)并且是独一无二的,所以我尝试如下

scores = ProductScore.objects.filter(client=request.user).order_by('created').distinct('scale')

这不起作用并抛出一些programming error exception

*** ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
LINE 1: SELECT DISTINCT ON ("product_productscore"."scale...
                            ^

那么如何从上表中获取最近创建的唯一记录?

【问题讨论】:

    标签: django postgresql django-models sql-order-by distinct


    【解决方案1】:

    PostgreSQL 要求您这样做:

    ProductScore.objects.filter(client=request.user).order_by('scale', '-created').distinct('scale')
    

    ...按-created 排序将为您提供每个重复项的最新信息,但您的整体查询结果将按scale 字段排序

    【讨论】:

    • 感谢工作!!!!但是当用order_by('sub_scale', '-created')而不是order_by(('scale', '-created'))调整order_by部分时
    • 啊是我的错误,不应该将元组传递给order_by...更新
    猜你喜欢
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2016-12-17
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多