Как создать запрос на сопоставление ключей?

Я использую ключ другого пользователя, спонсора, чтобы указать, кто является спонсор пользователя, и он создает ссылку в хранилище данных для тех пользователей, у которых есть спонсор, и он может быть не более одного, но спонсор может спонсировать многих пользователей, как в этом случае ID 2002, который спонсировал трех других пользователей:

enter image description here

В В этом случае этот запрос делает то, что я хочу: SELECT * FROM User, где спонсор = KEY ('agtzfmJuYW5vLXd3d3ILCxIEVXNlchjSDww') , но я не знаю, как запрограммировать это с помощью python, я могу использовать его только в хранилище данных. Как я могу выполнить запрос по ключу, если я хочу сопоставить набор пользователей, у которых тот же пользователь в качестве ключа в том же поле? У пользователя в моей модели может быть не более одного спонсора, и я просто хочу знать, кого спонсировал конкретный человек, что может быть списком пользователей, а затем они, в свою очередь, спонсировали пользователей, о которых я также хочу запросить.

Спонсор поля является ключевым и имеет ссылку на спонсора в хранилище данных. Я установил ключ так же, как user2.sponsor = user1.key, а теперь я хочу найти всех пользователей user1, спонсируемых с помощью запроса, который должен быть похож на

User.All (). filter ('спонсор =', user1.key)

, но спонсор - это поле типа key поэтому я не знаю, как сопоставить его, чтобы увидеть, например, список людей, спонсором которых является активный пользователь, и как он становится деревом, когда у второго поколения также есть ссылки. Как выбрать список пользователей, спонсором которых является этот пользователь, а затем второе поколение? Когда я смоделировал отношение просто как u1 = u2.key, то есть user2.sponsor = user1.key. Спасибо за любую подсказку.

Следующий обходной путь - плохая практика, но это мое последнее и единственное средство:

def get(self):
    auser = self.auth.get_user_by_session()
    realuser = auth_models.User.get_by_id(long( auser['user_id'] ))
    q = auth_models.User.query()
    people = []
    for p in q:
      try:
        if p.sponsor == realuser.key:
           people.append(p)
      except Exception, e:
        pass
    if auser: 
        self.render_jinja('my_organization.html', people=people, user=realuser,)

Обновление

Проблема заключается в том, что свойство key не требуется и что Гвидо Ван Россум сообщил об этом как об ошибке в ndb, когда я думаю, что это ошибка в моем коде. Вот то, что я использую сейчас, что является очень приемлемым решением, поскольку каждый реальный пользователь в организации, за исключением, возможно, программистов, тестировщиков и администраторов, должен будет иметь идентификатор спонсора, который является идентификатором пользователя.

from ndb import query
class Myorg(NewBaseHandler):
    @user_required
    def get(self):
        user = auth_models.User.get_by_id(long(self.auth.get_user_by_session()['user_id']))
    people = auth_models.User.query(auth_models.User.sponsor == user.key).fetch()
        self.render_jinja('my_organization.html', people=people,
                              user=user) 

class User(model.Expando):
    """Stores user authentication credentials or authorization ids."""

    #: The model used to ensure uniqueness.
    unique_model = Unique
    #: The model used to store tokens.
    token_model = UserToken
    sponsor = KeyProperty()
    created = model.DateTimeProperty(auto_now_add=True)
    updated = model.DateTimeProperty(auto_now=True)
    # ID for third party authentication, e.g. 'google:username'. UNIQUE.
    auth_ids = model.StringProperty(repeated=True)
    # Hashed password. Not required because third party authentication
    # doesn't use password.
    password = model.StringProperty()
    ...
7
задан Niklas Rosencrantz 8 January 2012 в 10:48
поделиться