3

非リレーショナルデータベースの外部キーのプロパティに基づいてフィルタリングするのに最適な方法は何ですか?私は、joinのサポートの欠如が事態をより複雑にしていることを理解しています。django-nonrelの外部キープロパティのフィルタ

私の場合、地域に属するサイトに属するイベントがあります。私は、特定の地域のすべてのイベントをフィルタリングしたい。 site__regionはjoinを必要とするため、

region = Region.objects.get(id=regionID) 
events = Event.objects.filter(site__region=region) 

これは動作しません、それは上のサポートされていない:Eventは、順番にRegionからregion外部キーを持つSiteへの外部キー、あるsite性質を持っていますdjango-nonrelはGoogle App Engine上で動作します。 (私はエラーとして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) 

が、これは物事を行うことには良い方法ですか?私が見落としたばかげた何かがありますか?前もって感謝します!

答えて

8

これは非常に非効率的なソリューションです。なぜなら、サイトと地域を間接的に参照し、たくさんのクエリを発生させるからです。これはあなたのDBの多分100のイベントを超えてスケ​​ールされません。

最高の解決策は、データを非正規化することです。その領域のidをsave()のEventに設定します。次に、Event.objects.filter(region_id = regionID)を直接実行できます。結果として生成されるコードは、きれいでメンテナンスが難しくなりますが、これは非リレーショナルDBでの作業の方法です。今日はです。

私が今言うことができるのは、できれば1月の終わりまで待ってください。 ;)

+0

です:あなたはすでにdbindexer使用している場合はhttp://www.allbuttonspressed.com/blog/django/joins-for-nosql-databases-via-django-dbindexer-first-steps

あなたは、単にこのような何かを使用して、インデックスを登録する必要がありますか?彼らはいつも「年末」を挙げており、その年は決して終わらないようです。 :P – munchybunch

+0

ああ、あなたはdjango-nonrelの開発者です!それはすごく、すべてのあなたの仕事のおかげです。 1月を楽しみにしています... – munchybunch

1

1月が終わり、dbindexerでシンプルなJOINSがサポートされるようになりました。あなたはおよそここで読むことができます:1月の部分はGAE上のSQLデータベースへの参照

# photo/dbindexes.py: 

from models import Event 
from dbindexer.lookups import StandardLookup 
from dbindexer.api import register_index 

register_index(Event, {'site__region': StandardLookup(),}) 
関連する問題