简体   繁体   English

Django / Postgres:从DISTINCT ON集中选择

[英]Django/Postgres: Choose from DISTINCT ON sets

I have these models: 我有以下模型:

class Product(Model):
    ...

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

I'm trying to get one scanning for each product where the scanning is a latest one from product.scanning.all() set. 我正在尝试从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)

would return <s4,s3,s5> 将返回<s4,s3,s5>

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

Raises exception: 引发异常:

ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions LINE 1: SELECT DISTINCT ON ("productapp_scanning"."product_id") "pro... ^ ProgrammingError:SELECT DISTINCT ON表达式必须与初始ORDER BY表达式匹配第1行:SELECT DISTINCT ON(“ productapp_scanning”。“ product_id”)“ pro ... ^

How to make it work? 如何使其运作?

With postgres, you cannot do distinct on a field, unless it's also what you sort by: 使用postgres时,您不能在字段上进行distinct ,除非它也是您的排序依据:

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

If that's not good enough, one solution is to make a double query like this: 如果这还不够好,一种解决方案是进行如下双重查询:

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])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM