2012-07-19 67 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