Я использую ключ другого пользователя, спонсора, чтобы указать, кто является спонсор пользователя, и он создает ссылку в хранилище данных для тех пользователей, у которых есть спонсор, и он может быть не более одного, но спонсор может спонсировать многих пользователей, как в этом случае ID 2002, который спонсировал трех других пользователей:
В В этом случае этот запрос делает то, что я хочу: 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()
...