Как выбрать все строки без ссылок из другого модельного класса в GQL?
Я имею
class Question(db.Model):
wording = db.StringProperty(required=True)
class Answer(db.Model):
question = db.ReferenceProperty(Question, required=True)
userId = db.IntegerProperty(required=True)
И я хочу
SELECT * FROM Question WHERE Id NOT IN (
SELECT QuestionId FROM Answer WHERE userId = 1)
Как это сделать в GQL
1 ответ
GQL не имеет NOT IN
Заявление, так что, к сожалению, не возможно сделать именно то, что вы хотите.
Если общий набор userIds невелик, вы можете отменить свой запрос, чтобы использовать IN
заявление. Например:
SELECT * FROM Answer WHERE userId IN ('2', '3')
Обратите внимание, что это выполняет подзапрос для каждого значения в IN
оператор, и вам разрешено максимум 30 запросов на оператор GQL.
Если общий набор ответов где userId = 1
маленький, вы можете выбрать все ответы и отфильтровать userId = 1
в вашем собственном коде. Однако, если набор Ответов от userId 1 велик, это не будет особенно эффективно.
Наконец, вместо вычисления любого из этих запросов по требованию вы можете использовать cron для предварительного вычисления результатов (и сохранения их в хранилище данных и / или memcache). Когда ваш код требует результатов одного из этих запросов, вы можете загрузить кэшированный результат.