#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 также невозможно.