Django-Nonrelの外部キープロパティでフィルタリングします
-
13-10-2019 - |
質問
非関係データベース内の外部キーのプロパティに基づいてフィルタリングするためのベストプラクティスは何ですか?私はその欠如を理解しています join
サポートは物事をより複雑にするので、私は他の人がどのようにそれを回避したのか疑問に思っていました。
私の場合、私は地域に属するサイトに属するイベントがあります。特定の地域のすべてのイベントをフィルタリングしたいです。 an Event
があります site
Aの外部鍵であるプロパティ Site
, 、次に region
aの外部キー Region
:
region = Region.objects.get(id=regionID)
events = Event.objects.filter(site__region=region)
Site__Regionにはaが必要なため、これは機能しません join
そして、それはGoogle App Engineで実行されているDjango-Nonrelではサポートされていません。 (わかりました Caught DatabaseError while rendering: This query is not supported by the database.
エラーとして。)このように、私はイベントを繰り返して、リストに一致するものを追加しています。
events = list()
region = Region.objects.get(id=regionID)
for event in Event.object.all():
if event.site.region==region:
events.append(event)
これは物事をするのに良い方法ですか?私が見落としている愚かなことはありますか?前もって感謝します!
解決
これは非常に非効率的な解決策です。これは、サイトと領域を繰り返し、多くのクエリを引き起こすためです。これは、DBで100のイベントを超えることはありません。
最良の解決策は、save()のイベントに領域のIDをコピーすることにより、データを非定型化することです。その後、event.objects.filter(region_id = regionid)を直接実行できます。結果のコードはきれいになり、維持可能になりますが、それは非関連DBでの作業方法です。 今日.
私が今言うことができるのは、可能であれば1月末まで待ってください。 ;)
他のヒント
1月がなくなり、DbindexerはSimple結合をサポートしています。ここで読むことができます: http://www.allbuttonspressed.com/blog/django/joins-for-nosql-databases-via-django-dbindexer-first-steps
既にdbindexerを使用している場合は、次のようなものを使用してインデックスを登録するだけです。
# photo/dbindexes.py:
from models import Event
from dbindexer.lookups import StandardLookup
from dbindexer.api import register_index
register_index(Event, {'site__region': StandardLookup(),})