【问题标题】:Simple Django Search Run on Django App Engine?在 Django App Engine 上运行简单的 Django 搜索?
【发布时间】:2012-07-19 04:17:01
【问题描述】:

在我的聚合 NBA 球员统计数据的 Django 项目(作为一个学习项目)中,我构建了一个简单的搜索视图,允许您按名字或姓氏(或两者)搜索球员。它在开发服务器上运行良好,但现在我想使用 Google App Engine 部署我的网站,我遇到了我认为是由于 GAE 的 High Replication Datastore 造成的错误。

我的印象是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) 如果可以使用,并且我在 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)

【问题讨论】:

  • 你是什么意思它在开发服务器上工作正常?它在 dev_appserver 上正常运行?
  • 我的意思是当我使用“python manage.py runserver”运行我的项目时,我的代码完全按照我的意愿运行。
  • 我不清楚你是在运行 django 项目还是 django-nonrel 项目。听起来你建立了一个非 GAE django 项目,并试图让它在 GAE 上工作。我目前感到困惑的是,我希望如果您正确设置它,您应该会在本地看到相同的失败。我在你的树中没有看到 app.yaml 或 django 文件夹,这对于你的 GAE 项目来说是必需的。
  • 你是对的;我建立了一个非 GAE 项目,并试图将其移植过来。我上面的所有信息都是针对我普通的旧 Django 项目的。到目前为止,我没有发布我尝试过的内容,因为它是从多篇文章和 testapp 示例中挑选出来的大杂烩。我希望有人能给我一套更统一的步骤来移植我的项目,但听起来这可能是不可能的。
  • 我不太清楚,但我的建议是用简单的非关系查询重写应用程序。

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


【解决方案1】:

一般来说,JOIN 是不被支持的,所以所有带有 OR 的 Q 对象可能都不起作用。

我没怎么用过 dbindexer,所以我不确定它的能力如何。我确实认为,如果您使用它,它会尝试自动执行所有额外的索引,从而使您的数据存储查询变得昂贵。

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

【讨论】:

  • 问题是,我什至无法让带有“&”的 Q 对象工作。这就是为什么我觉得我一定没有正确设置一些东西。
  • 我没有尝试过Q对象,所以我不知道它们是否有效。
【解决方案2】:

好的,所以在使用“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 对象),搜索工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 2013-12-20
    • 1970-01-01
    • 2010-10-06
    • 2023-03-23
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多