我在尝试使用AppEngine框架中的ndb查询对象时遇到了一些问题。我对ndb很新,我认为我误解了一些重要的概念。
这就是我所拥有的:
我的模型名为Teacher
:
from webapp2_extras.appengine.auth.models import User
class Teacher(ndb.Model):
user = ndb.StructuredProperty(User)
ranking = ndb.FloatProperty(required=True)
如您所见,用户模型来自webapp2框架。然后我尝试查询与某个用户关联的教师。我是这样做的:
def _findTeacher(self, user):
t = Teacher.query(Teacher.user == user).fetch(1)
if t:
return t[0]
else:
return None
作为此功能的参数的用户如下获得:
user_session = self.auth.get_user_by_session()
user = self.auth.store.user_model.get_by_auth_token(user_session['user_id'], user_session['token'])[0]
但是,我收到以下错误:
BadFilterError: invalid filter: Cannot query for non-empty repeated property auth_ids.
我真的想知道我的错误在哪里,并且使用ndb和webapp2 auth系统的应用程序示例也非常有用。
谢谢大家
答案 0 :(得分:1)
虽然可以重复StructuredProperty并且StructuredProperty可以包含另一个StructuredProperty,但要注意:如果一个structred属性包含另一个,则只能重复其中一个。
发生错误是因为Teacher.User是一个StructuredProperty,其中包含Teacher.User.auth_ids,这是一个重复的StructuredProperty。
我建议这样做:
class Teacher(ndb.Model):
user = ndb.KeyProperty(User)
ranking = ndb.FloatProperty(required=True)
存储对用户的引用。对于上面的例子,这将有效。但是,这也意味着您无法查询用户的任何属性,例如Teacher.User.name == 'bob'
。
你这样查询:
t = Teacher.query(Teacher.user == user.key).fetch(1)
我希望这会有所帮助。