App引擎ndb。基于Reference属性的查询模型

时间:2013-03-20 20:09:42

标签: python google-app-engine

我在尝试使用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系统的应用程序示例也非常有用。

谢谢大家

1 个答案:

答案 0 :(得分:1)

来自NDB Properties

  

虽然可以重复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)

我希望这会有所帮助。