App Engine にアプリケーションがあり、このアプリケーションには Appointment というエンティティがあります。Appointment には start_time と end_time があります。時間に基づいて予定を取得したいので、たとえば、特定の日のすべての予定を取得したいとします。
アプリ エンジンは 2 つのフィールドに基づく不等式クエリをサポートしていないため、どうすればよいですか?
App Engine にアプリケーションがあり、このアプリケーションには Appointment というエンティティがあります。Appointment には start_time と end_time があります。時間に基づいて予定を取得したいので、たとえば、特定の日のすべての予定を取得したいとします。
アプリ エンジンは 2 つのフィールドに基づく不等式クエリをサポートしていないため、どうすればよいですか?
日付用に別のフィールドを追加できます。ComputedProperty は、おそらくそのために理にかなっています。または、1 日の始まりからバッチでフェッチし、1 日の終わりに達したらフェッチを停止することもできます。これを合理的に効率的に保つために、1日に通常行う予定の数に基づいて、賢明なデフォルトを考え出すことができると思います。
最大の問題は、「日付」がユーザーのタイムゾーンに応じて異なる開始と終了の「時間」を意味することです。また、DSTが年に2回変更されることは言うまでもなく、すべてのユーザーにすべてのライフタイムを1つのタイムゾーンに固執させることはできません。したがって、提案されたように、エンティティに新しいプロパティを作成して「日付」オブジェクトを格納することはできません。(これが、GAEに「日付」タイプのプロパティがない理由です。)
スケジューリングアプリを作成しました。ユーザーがイベントの目的の範囲(1日、1週間、または1か月)を指定すると、要求された範囲の開始時刻よりも大きい終了時刻を持つすべてのイベントを取得し、次に、範囲の終了時間よりも開始時間が短い最後のイベントを見つけます。
要求された範囲に応じて、1つの要求でフェッチするエンティティの数を指定できます(1日よりも1か月の方が多い)。たとえば、特定のカレンダーで1日あたり5〜10のイベントが発生する可能性がある場合、最初の10個のエンティティをフェッチするだけで十分です(条件が満たされない場合は、いつでもさらにフェッチできます)。たとえば、1か月間、バッチサイズを100に設定できます。ただし、これはマイクロ最適化です。
"SELECT * FROM appointments WHERE start_time < {0} AND end_time > {0}".format(time_lookup)
または、appengineでそれができない場合は、おそらく
Things.all().filter("end_time >", foo).filter("start_time <", foo)
http://nick.zoic.org/art/python/multiple_inequalities/
また、Google App Engine データストア (多対多、Python) で多くの日付範囲を比較すると役立つ場合があります