1

NBAプレーヤーの統計を(学習プロジェクトとして)集約する私のDjangoプロジェクトでは、名前または姓(あるいはその両方)でプレーヤーを検索できるシンプルな検索ビューを構築しました。開発サーバーでは完全に正常に機能しますが、Google App Engineを使用してサイトをデプロイしたいのですが、GAEの高レプリケーションデータストアが原因であると思われるエラーが発生します。

Django-nonrel / dbindexerツールがこの問題を軽減するのに役立つという印象を受けましたが、これまでのところ、それらを無駄に実装しようとしました-自分のサイトで検索しようとすると、次のメッセージを含むエラーログが表示されます:'DatabaseError:このクエリはデータベースでサポートされていません。'

私の問題は、これらのツールの説明が開発のさまざまな時点で作成された複数のドキュメントに分散していることだと思います。そのため、それらを1つのまとまりのある画像にまとめるのは難しいです。また、私は彼らが提供するtestappを調べましたが、それは彼らの指示が示唆するものとは多少異なって設定されているようです。だから私は2つの質問をしたいと思います:

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)
4

2 に答える 2

2

Generally, JOINs are not supported, so all the Q objects with ORs probably won't work.

I haven't used dbindexer much, so I'm not sure how capable it is. I do think if you use it, it will make your datastore queries expensive with all the extra indexing it tries to do automatically.

Even if you're using django-nonrel, you can't expect to port a django app over directly if it uses relational data. You'll have to restructure your data and queries to be non-relational.

于 2012-07-19T05:07:43.980 に答える
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 フィルターのみがサポートされています"

コード (および「OR」を含む Q オブジェクト) から「distinct()」ビットを削除したので、検索は正常に機能します。

于 2012-07-23T05:30:38.723 に答える