#python #google-app-engine #gql
#python #google-app-engine #gql
Вопрос:
Краткая версия моего вопроса: каков синтаксис Gql для фильтрации запросов на основе ссылочного свойства?
Длинная версия моего вопроса: Предположим, что следующая модель:
Class User(db.Model):
username = db.StringProperty()
password = db.StringProperty()
Class Portfolios(db.Model):
portname = db.StringProperty()
Class Portfolio_Owners(db.Model):
port_id = db.ReferenceProperty(Portfolios)
user_id = db.ReferenceProperty(User)
key_string = db.StringProperty()
Я хочу запросить Portfolio_Owners на основе user_id (который является ReferenceProperty).
Однако я не могу выполнить запрос к строке свойства .user_id, как вы сделали бы для свойства StringProperty (следующее возвращает пустой список):
key_string = 'aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM'
que=db.GqlQuery("SELECT * FROM Portfolio_Owners WHERE user_id=:1", key_string)
entity = que.fetch(limit=10)
Я также не могу запросить ключевой объект этого пользователя (следующий также возвращает пустой список):
key_object = db.Key('aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM')
que=db.GqlQuery("SELECT * FROM Portfolio_Owners WHERE __key__=:1", key_object)
entity = que.fetch(limit=10)
И да, я уверен, что идентификатор пользователя правильный…вот копия-вставка из средства просмотра хранилища данных:
Entity Kind Portfolio_Owners
Entity Key aglwb3J0Zm9saW9yFwsSEFBvcnRmb2xpb19Pd25lcnMYhQIM
ID 261
user_id (Key) aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM
User: id=234
port_id (Key) aglwb3J0Zm9saW9yEQsSClBvcnRmb2xpb3MYhAIM
Portfolios: id=260
Я не нашел ответа в документах App Engine, на досках сообщений App Engine или где-либо еще на SO.
Спасибо!
Ответ №1:
Итак, aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM
это ваш пользовательский ключ, верно? Давайте начнем с этого:
user = db.Key('aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM')
que = db.GqlQuery("SELECT * FROM Portfolio_Owners WHERE user_id = :1", user)
Это должно предоставить вам любые объекты Portfolio_Owners, которые ссылаются на этого пользователя.
Вы можете сократить это до этого:
user = db.get('aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM')
que = user.Portfolio_Owners_set
Хранилище данных принципиально сильно отличается от SQL. Основываясь на ваших примерах кода, я думаю, вам было бы полезно пересмотреть документы, чтобы лучше понять дизайн хранилища данных:
http://code.google.com/appengine/docs/python/datastore/entities.html
Комментарии:
1. Спасибо. могу поклясться, что я тоже пробовал это, но у меня, очевидно, была опечатка или сравнительно глупая синтаксическая ошибка. еще раз спасибо.
2. @Jeff В примерах в вашем вопросе вы делаете все наоборот — вы пытаетесь получить запись с этим ключом, а не записи, которые содержат этот ключ в своем свойстве reference.
3. спасибо, Ник. я представил только пару из множества неудачных запросов, которые я пытался выполнить. 😉 Конечно, казалось более логичным фильтровать по user_id как свойству, но я не мог заставить это работать, поэтому я подумал, что, возможно, Хранилище данных распознает user_id только как ключевой объект.