google-app-engine:当filter参数为db.ReferenceProperty时,如何在查询中应用过滤器?

时间:2011-12-13 21:24:37

标签: python google-app-engine gql

这是this问题的下一步,我需要运行查询并应用过滤器。 这是我的模型

from google.appengine.ext import db
Class Car(db.Model):
    name=db.StringProperty()
    model=db.StringProperty()
    mileage=db.IntegerProperty()
    person = db.ReferenceProperty(Person, collection_name='person')

Class Person(db.Model):
    name=db.StringProperty()
    age=db.IntegerProperty()

问题:对于一个人,我想获得他拥有的所有车辆

方法:获取所有车辆并对名称为“随机”的人应用过滤器 我尝试了以下但是它不起作用

s = Car.all()
s.filter('person.name =', 'Random') # It fails here
result = s.fetch(1)[0] # just first result for now
print result.text
print result.votes
print result.page.language

如何运行此查询? 谢谢

1 个答案:

答案 0 :(得分:2)

您只能对索引属性使用过滤器。 person.name来自其他实体!在sql中,您需要使用join(这在数据变大时是不可能的),在google bigtable中,就像许多其他非关系数据库表join一样。幸运的是,你的情况非常简单,如果你知道关键人物,你可以选择所有的汽车:

>>> person = Person.all().filter('name =', 'Mr. Random').fetch(1)[0]
>>> cars = Car.all().filter('person =', person.key())

如果您为collection_name

使用了更合理的值
Class Car(db.Model):
    ...    
    person = db.ReferenceProperty(Person, collection_name='cars_collection')

您可以访问所有这样的汽车:

>>> person = Person.all().filter('name =', 'Mr. Random').fetch(1)[0]
>>> mrs_randoms_cars = person.cars_collection