2016-10-23 2 views
0

私は2つのデータストアモデル、グループ&を持っています。製品には2つのカテゴリがあります。セキュア&非セキュア。そして各製品はグループに属しています。異なるソートオプションを使用した複雑なアクセス管理のためのDatastoreモデル

ユーザーには、管理者、通常ユーザー、グループメンバーの3種類があります(ユーザーは複数のグループに所属できます)。

管理者ユーザーはすべてのグループにアクセスできます。通常のユーザー(グループに属していないユーザー)は、非セキュアな製品のみにアクセスできます。 グループメンバーは、自分が所属するグループのすべてのプロダクトと、グループに所属していないすべての非セキュアなプロダクトにアクセスできます。

そして、データストアのカーソルに基づいて製品のリストを照会して、一度に15レコードを取得し、結果をlast_updated_dateで並べ替える必要があります。 adminの

、クエリ:一般ユーザのためにPRODUCT.query().fetch_page(25, start_cursor=cursor).order(-PRODUCT.last_updated_date)

、クエリ:PRODUCT.query(PRODUCT.secure=False).fetch_page(25, start_cursor=cursor).order(-PRODUCT.last_updated_date)

は、私は基本的に「IN」と演算子、非等価演算子との仕分けを持つグループのメンバーのためのクエリについて少し混乱していますlast_updated_date。グループに所属するユーザーの検索結果を取得するためのクエリを作成する方法:G1、G3、G5?

おそらくSQLクエリは、私がlast_updated_dateでソートしてNDBデータストアクエリを書くのを手伝ってください。この

Select * from Product where Group IN (Select GroupID from User where email='[email protected]') 

UNION 

Select * from Product where Secure = No 

のように見えます。

答えて

1

これを試してみてください:

group_ids_of_user = ['G1', 'G3', 'G5'] 
query = Product.query(ndb.OR(Product.secure == False, 
          ndb.AND(Product.secure == True, Product.group.IN(group_ids_of_user)))) 
+0

はありがとうございました。追加される条件がもう1つ必要です。特定のグループが制限されたグループである場合、すべての製品(セキュア/非セキュア)はグループ以外のメンバーから非表示にする必要があります。どのようにこの条件を追加するには? – Rookie

+0

ProductとGroupに参加するか、ProductとGroupを非正規化する方法を見つける必要があるため、上記のフェッチされたクエリ結果をフィルタリングするために、制限のないPythonフィルタを使用することをお勧めします。結合の種類はありませんし、INも不可能です。 – voscausa

関連する問題