在Django App Engine上运行简单的Django搜索?

时间:2012-07-19 04:17:01

标签: django google-app-engine django-nonrel

在我的Django项目中汇总了NBA球员统计数据(作为学习项目),我建立了一个简单的搜索视图,允许您按名字或姓氏(或两者)搜索球员。它在开发服务器上工作得很好,但现在我想使用Google App Engine部署我的网站,而且我收到错误,我认为这是由GAE的高复制数据存储区引起的。

我的印象是Django-nonrel/dbindexer工具有助于缓解此问题,但到目前为止,我已尝试实施它们无济于事 - 当我尝试在我的网站上搜索时,我收到错误日志消息:'DatabaseError:数据库不支持此查询。'

我猜我的问题可能是这些工具的说明分布在他们开发的不同点上编写的多个文档中,因此将它们组合成一个连贯的图片是很棘手的。此外,我看了他们提供的测试应用程序,它似乎与他们的指示建议有些不同。所以我想问两个问题:

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)如果可以使用,并且我在dev中的项目结构如下,那么为了使我的搜索视图在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)

2 个答案:

答案 0 :(得分:2)

通常,不支持JOIN,因此所有带OR的Q对象可能都不起作用。

我没有多使用dbindexer,所以我不确定它有多强大。我确实认为如果你使用它,它将使你的数据存储查询变得昂贵,并且会自动尝试进行所有额外的索引。

即使您使用的是django-nonrel,如果它使用关系数据,也不能指望直接移植django应用程序。您必须将数据和查询重组为非关系型。

答案 1 :(得分:0)

好的,所以在使用“python manage.py remote shell”摆弄不同类型的查询之后,我得出以下结论:

1)正如@dragonx所提到的,不支持带有“OR”的Q对象。

2)然而,Q对象带有“&”肯定是。

3)我的搜索视图代码(“OR”查询除外)的问题是在我的“Player.objects.filter()”调用中添加了“distinct()”。显然HRD不支持“distinct()”,这是隐秘的

“DatabaseError:数据库不支持此查询”

消息。相比之下,尝试使用带有“OR”的Q对象可以提供更多帮助

“DatabaseError:仅支持AND过滤器”

现在我已从代码中删除了“distinct()”位(以及任何包含“OR”的Q对象),搜索工作正常。