2017-05-07 73 views
0

我有這些模型:Django的/的Postgres:選擇DISTINCT ON組

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 expressions must match initial ORDER BY expressions LINE 1: SELECT DISTINCT ON ("productapp_scanning"."product_id") "pro... ^

如何使它工作?

回答

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