Модель хранилища данных для комплексного управления доступом с различными вариантами сортировки

#python #google-app-engine #google-cloud-datastore

#python #google-app-engine #google-cloud-хранилище данных

Вопрос:

У меня есть две модели хранилища данных, Group amp; Products. Продукты содержат две категории: безопасные и небезопасные. И каждый продукт принадлежит группе.

У нас есть 3 типа пользователей: администратор, обычные пользователи и участники группы (пользователь может принадлежать более чем к одной группе).

Пользователи с правами администратора имеют доступ ко всем группам. Обычные пользователи (не принадлежащие ни к какой группе) имеют доступ только к незащищенным продуктам. Участники группы имеют доступ ко всем продуктам групп, к которым они принадлежат, и ко всем незащищенным продуктам групп, к которым они не принадлежат.

И нам нужно запросить список продуктов на основе курсора хранилища данных, чтобы получить 15 записей одновременно, и результаты должны быть упорядочены по last_updated_date.

Для администратора запрос: 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-запрос выглядит следующим образом

 Select * from Product where Group IN ( Select GroupID from User where email='a@a.com')

UNION 

Select * from Product where Secure = No
  

Пожалуйста, помогите мне написать запрос хранилища данных NDB с сортировкой по last_updated_date.

Ответ №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))))
  

Комментарии:

1. Большое вам спасибо. Необходимо добавить еще одно условие. Если определенная группа является ограниченной группой, все продукты (защищенные / небезопасные) должны быть скрыты от посторонних членов группы. Как также добавить это условие?

2. Я предлагаю вам использовать неограниченный фильтр Python для фильтрации приведенных выше результатов запроса, потому что вам нужно объединить продукт и группу или найти способ де-нормализовать продукт и группу. Объединение видов невозможно, и NOT IN также невозможно.