私の Google App Engine アプリには、保存する必要があるモデル オブジェクトがあります。これらのオブジェクトは、さまざまなポリシー オブジェクトによってパラメータ化されます。たとえば、私の Event クラスには、誰が表示、更新などを行えるかを決定する Privacy Policy オブジェクトがあります。PrivacyPolicy には、異なる動作をするさまざまなサブクラスがあります。イベントは、さまざまな時点でその PrivacyPolicy オブジェクトを調べます。
class PrivacyPolicy(db.Model):
def can_see(self, event, user):
pass
class OwnerOnlyPolicy(PrivacyPolicy):
def can_see(self, event, user):
return user == event.owner
class GroupOnlyPolicy(PrivacyPolicy):
def can_see(self, event, user):
for grp in event.owner.groups()
if grp.is_member(user):
return True
return False
class OnlyCertainUsersPolicy(PrivacyPolicy):
def __init__(self, others):
self.others = others
def can_see(self, event, user):
return user in others
Event クラスに、PrivacyPolicy への ReferenceProperty を使用させることができます。
class Event(db.Model):
privacy: db.ReferenceProperty(PrivacyPolicy)
#…
私がこれを好まない理由は、1 対 1 の関係とは、ポリシー オブジェクトに対してクエリを実行する人が誰もいないことを意味し、ポリシーからその Event オブジェクトへの後方参照を維持する必要がなく、それ以外の方法がないことです。 PrivacyPolicy は、独立した db レベルのオブジェクトです。これは、Event オブジェクトの状態の一部であり、数値ではなく単なるオブジェクトであるという点で、IntegerProperty と機能的に同等です。具体的には、Event タイプに不明な、状態がゼロまたは多数の状態を持つことができるオブジェクトです。
そのような状況にどのようにアプローチするかについて話している人を見つけることができません。私が知らないツール/アプローチはありますか? 私はそれを吸い上げて参照プロパティを使用し、オーバーヘッドで地獄を使用しますか?
これを処理する他の唯一の方法がカスタム プロパティ タイプである場合は、それにアプローチする方法についてのアドバイスを歓迎します。私が最初に考えたのは、TextProperty を使用してポリシー オブジェクト ( policy
) の文字列表現を格納し、必要に応じてデコードし、結果をキャッシュし、ポリシー オブジェクトに何らかの変更を加えてキャッシュを無効にし、文字列表現を更新することです。