【问题标题】:Django/Postgres: Choose from DISTINCT ON setsDjango/Postgres:从 DISTINCT ON 集合中选择
【发布时间】:2017-05-07 21:01:26
【问题描述】:

我有这些模型:

class Product(Model):
    ...

class Scanning(Model):
    product = ForeignKey(..)
    datetime = DateTimeField(...)
    ...

我正在尝试对每个产品进行一次扫描,其中扫描是来自product.scanning.all() 集合的最新产品。

s1 = (product1,01.01.1000)
s2 = (product2,01.01.1200)
s3 = (product1,01.01.1900)
s4 = (product2,01.01.1988)
s5 = (product3,01.01.2015)
s6 = (product3,01.01.1970)

会返回<s4,s3,s5>

Scanning.objects.filter(product__user=u,product__active=True).distinct('product_id').order_by('datetime')

引发异常:

ProgrammingError: SELECT DISTINCT ON 表达式必须匹配初始 ORDER BY 表达式第 1 行:SELECT DISTINCT ON ("productapp_scanning"."product_id") "亲... ^

如何让它发挥作用?

【问题讨论】:

    标签: django postgresql django-models distinct django-orm


    【解决方案1】:

    使用 postgres,您不能在字段上执行 distinct,除非它也是您的排序依据:

    Scanning.objects.filter(product__user=u,product__active=True).distinct('product_id').order_by('product_id', 'datetime')
    

    如果这还不够好,一种解决方案是像这样进行双重查询:

    q1 = Scanning.objects.filter(product__user=u,product__active=True).values('product_id').distinct().annotate(x=Max('id'))
    
    q2 = Scanning.objects.filter(id__in=[i["x"] for i in q1])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-17
      • 2021-02-28
      • 2018-11-23
      • 1970-01-01
      • 2013-03-15
      • 2011-04-20
      • 2010-11-02
      • 2019-02-18
      相关资源
      最近更新 更多