Запрос Gql к ReferenceProperty()

#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 только как ключевой объект.