2013-08-23 22 views
1

我正在使用一些複雜的查詢來返回排名,比率和其他複雜輸出的django應用程序。我已經遵循了幾個從網上exampled,這幫助我找到最好的方式來把它和檢索數據返回將get_absolute_url合併到django中的原始SQL語句

然而,我想找到一種方法來注入自定義的詳細信息到一個給定的記錄,爲在我的情況下,試圖將get_absolute_url()值關聯到返回的記錄集

下面是一個返回最常用的興趣的示例,此查詢將始終返回一個有限的查詢集,有沒有一種方法來擴展返回的字典與模型的get_absolute_url()值?

def most_used_interests(self, limit_by=10): 
    cursor = connection.cursor() 
    cursor.execute(""" 
      SELECT 
       i.name, 
       i.name_ar, 
       i.name_en, 
       ij.interest_id, 
       SUM (ij.C) item_count 
      FROM 
       (
        SELECT 
         C .interest_id, 
         COUNT (b. ID) C 
        FROM 
         bargain_bargain b, 
         bargain_bargain_bargain_target C 
        WHERE 
         b. ID = C .bargain_id 
        GROUP BY 
         C .interest_id 
        UNION 
         SELECT 
          x.interest_id, 
          COUNT (P . ID) C 
         FROM 
          promotion_promotion P, 
          promotion_promotion_promo_target x 
         WHERE 
          x.promotion_id = P . ID 
         GROUP BY 
          x.interest_id 
       ) ij, list_interest i 
      WHERE i.id=ij.interest_id 
      GROUP BY 
       ij.interest_id, 
       i.name, 
       i.name_ar, 
       i.name_en 
      ORDER BY 
       item_count DESC 
      LIMIT %s 
    """, [limit_by, ]) 
    desc = cursor.description 
    if cursor.rowcount: 
     return [ 
      dict(zip([col[0] for col in desc], row)) 
      for row in cursor.fetchall() 
     ] 
    return None 
+0

你的意思是除了在壓縮之前取出和擴展列之外? –

+0

是啊,嘗試添加get_absolute_url,因爲他們分配給返回的字典 –

回答

1

我發現了一個更簡單的方法來處理的情況下,爲他人誰面臨着類似的問題,我包我的查詢總是返回的對象,然後使用objects.raw爲返回的查詢

def most_used_interests(self, limit_by=10): 
    return self.raw(""" 
      SELECT 
       * 
      FROM 
       list_interest l, 
       (
        SELECT 
         ij.interest_id, 
         SUM (ij. C) item_count 
        FROM 
         (
          SELECT 
           C .interest_id, 
           COUNT (b. ID) C 
          FROM 
           bargain_bargain b, 
           bargain_bargain_bargain_target C 
          WHERE 
           b. ID = C .bargain_id 
          GROUP BY 
           C .interest_id 
          UNION 
           SELECT 
            x.interest_id, 
            COUNT (P . ID) C 
           FROM 
            promotion_promotion P, 
            promotion_promotion_promo_target x 
           WHERE 
            x.promotion_id = P . ID 
           GROUP BY 
            x.interest_id 
         ) ij 
        GROUP BY 
         ij.interest_id 
        LIMIT %s 
       ) tl 
      WHERE 
       l. ID = tl.interest_id 
      ORDER BY 
       item_count DESC 
    """, [limit_by, ]