2012-07-19 34 views
1

在我的Django項目中,彙總了NBA球員的統計數據(作爲一個學習項目),我建立了一個簡單的搜索視圖,允許您按姓名(或兩者)搜索球員。它在開發服務器上工作良好,但現在我想使用Google App Engine部署我的網站,並且我收到了我認爲是由於GAE的高複製數據存儲導致的錯誤。在Django App Engine上運行簡單的Django搜索?

我的印象是,Django-nonrel/dbindexer工具可以幫助緩解這個問題,但到目前爲止,我已經嘗試實施它們無濟於事 - 當我嘗試在我的網站上進行搜索時,出現帶有消息的錯誤日誌:'DatabaseError:該查詢不受數據庫支持。'

我猜我的問題可能是這些工具的指令分佈在多個文檔中,這些文檔在開發過程中的不同點上編寫,因此我很難將它們放在一起成爲一個連貫的圖片。另外,我已經看過他們提供的testapp,它似乎設置的有點不同於他們的說明。所以我想問兩個問題:

1)我編碼的視圖甚至可以與GAE和Django-nonrel/dbindexer一起使用嗎?那就是:

def search(request): 
     query = request.GET.get('q','') 
     querywords = query.split(' ') 
     lname='' 
     for word in querywords[1:-1]: 
       lname += word+' ' 
     lname += querywords[-1] 
     if query: 
       if len(querywords)>1: 
         qset = (
           Q(first_name__iexact=querywords[0]) & 
           Q(last_name__iexact=lname) 
         ) 
         exact_results = Player.objects.filter(qset).distinct() 
         if exact_results != []: 
           result = exact_results 
           qset = (
             Q(first_name__icontains=querywords[0])| 
             Q(last_name__icontains=querywords[0])| 
             Q(first_name__icontains=lname)| 
             Q(last_name__icontains=lname) 
           ) 
           results = Player.objects.filter(qset).distinct() 
           results = results.order_by('last_name','first_name') 
         else: 
           qset = (
             Q(first_name__icontains=querywords[0]) & 
             Q(last_name__icontains=lname)| 
             Q(first_name__icontains=querywords[0])| 
             Q(last_name__icontains=querywords[0]) 
           ) 
           results = Player.objects.filter(qset).distinct() 
           results = results.order_by('last_name','first_name') 
           result = '' 
       else: 
         qset = (
           Q(first_name__icontains=querywords[0])| 
           Q(last_name__icontains=querywords[0]) 
         ) 
         results = Player.objects.filter(qset).distinct() 
         results = results.order_by('last_name','first_name') 
         result = '' 
     else: 
       results = [] 
       result = '' 
     return render(request,'search.html', { 
       'result':result, 
       'results': results, 
       'query': query, 
       'querywords':querywords 
     }) 

2)如果可以使用,而我在開發項目結構如下,什麼是最節儉的一系列步驟,我可以跟着做我的搜索視圖正常工作在GAE ?

NBA/ 
    __init__.py 
    manage.py 
    settings.py 
    urls.py 
    templates/ 
      (html files) 
    players/ 
      __init__.py 
      admin.py 
      models.py 
      tests.py 
      views.py 
      fixtures/ 
        (some .yaml fixture files) 
      static/ 
        (css, js, and gif files) 
+0

你是什麼意思,它在開發服務器上工作正常?它在dev_appserver上正確運行? – dragonx 2012-07-19 04:52:25

+0

我的意思是當我使用「python manage.py runserver」運行我的項目時,我的代碼完全按照我的需要工作。 – GChorn 2012-07-19 06:12:32

+0

我不清楚你是運行django項目還是運行django-nonrel項目。這聽起來像你建立了一個非GAE django項目,並試圖讓它在GAE上工作。我現在困惑的是我期望如果你正確設置它,你應該在本地看到同樣的故障。我沒有在您的樹中看到app.yaml或django文件夾,這對於您的GAE項目來說是必需的。 – dragonx 2012-07-19 14:54:11

回答

0

好了,使用「蟒蛇manage.py遠程shell」不同類型的查詢擺弄左右後,我得出以下結論:

1)如前所述@dragonx,Q與「對象或「不支持。

2)然而,Q對象「&」肯定是。

3)除了「OR」查詢之外,我的搜索視圖代碼的問題是在我的「Player.objects.filter()」調用中添加了「distinct()」。顯然,HRD不支持「不同的()」,這是負責的神祕

「DatabaseError:此查詢不是數據庫支持」

消息。相比之下,欲借用「OR」給出了一個更爲有用

「DatabaseError:只有和過濾器都支持」問答對象

現在,我已經從刪除的「獨特()」我的位代碼(以及任何「OR」包含的Q對象),搜索工作正常。

2

一般情況下,JOINs不被支持,所以帶OR的所有Q對象可能都不起作用。

我還沒有使用過dbindexer,所以我不確定它有多強大。我認爲如果你使用它,它會讓你的數據存儲查詢花費很多,而且它會自動嘗試執行所有額外的索引。

即使您使用的是django-nonrel,如果它使用關係數據,也不能指望直接移植django應用。你必須重構你的數據和查詢,使之成爲非關係的。

+0

事情是,我甚至無法讓帶有「&」的Q對象工作。這就是爲什麼我覺得我不應該正確地設置一些東西。 – GChorn 2012-07-19 08:10:35

+0

我還沒有嘗試Q對象,所以我不知道他們是否可以工作。 – dragonx 2012-07-19 14:55:05