2017-04-10 16 views
0

我想在Django創建以下查詢創建的Django pgSQL的查詢有了COUNT,GROUP BY,間隔和LIMIT

SELECT content_reference , COUNT(reference) 
    AS total 
    FROM usage_statistics 
WHERE content_type = 'blog' 
    AND access_date > NOW() - INTERVAL '90' DAY 
GROUP BY content_reference 
ORDER BY total DESC 
LIMIT 10 

我已經想通了,到目前爲止是:

result = UsageStatistics.objects.values('content_reference')\ 
    .annotate(total=Count('reference'))\ 
    .order_by('total') 

這使得查詢

SELECT "usage_statistics"."content_reference", COUNT("usage_statistics"."reference") AS "total" 
    FROM "usage_statistics" 
GROUP BY "usage_statistics"."content_reference" 
ORDER BY "total" ASC 
LIMIT 21 

我不確定如何正確包括:

  • AND ACCESS_DATE> NOW() - INTERVAL '90' DAY
  • ORDER BY總DESC

以下是我usage_statistics使用表結構

CREATE TABLE usage_statistics 
(
    reference bigint 
    access_date timestamp with time zone, 
    ip_address inet NOT NULL, 
    language_iso text NOT NULL, 
    content_type character varying(12) NOT NULL, 
    content_reference text NOT NULL, 
    passport_user_id bigint 
) 

回答

2

您可以使用.filter()限制在過去60天內更改的值。它可以使用數據庫功能NOW(),或者你可能只是做數學在python:

.filter(access_date__gt=datetime.datetime.utcnow() - datetime.timedelta(days=60)) 

的順序同樣是可能的:

.order_by('-total') 

最後,你可以分得一杯羹上查詢集得到公正的前10個結果:

[:10] 

所以,你最終的查詢可能看起來像:

result = UsageStatistics.objects.filter(
    access_date__gte=datetime.datetime.utcnow() - datetime.timedelta(days=60) 
).values('content_reference').annotate(
    total=Count('reference') 
).order_by('-total')[:10] 
-1

: 結果= UsageStatistics.objects.raw(「SELECT content_reference,COUNT(reference) AS total FROM usage_statistics WHERE CONTENT_TYPE = '博客' 和ACCESS_DATE> NOW() - INTERVAL '90' DAY GROUP BY content_reference ORDER BY總DESC LIMIT 10「)

檢查https://docs.djangoproject.com/en/dev/topics/db/sql/瞭解更多詳情。

+0

對於像這樣的查詢,不需要下拉到raw sql:這意味着您不能再對結果執行進一步的查詢集級操作。 –