[Google App Engine]如何使用filter()?
我刚开始学习使用谷歌的应用引擎,想做一个类似推特的东西。
class User(db.Model):
account = db.StringProperty()
password = db.StringProperty()
name = db.StringProperty()
class Message(db.Model):
user = db.ReferenceProperty()
text = StringProperty()
created = DateTimeProperty(auto_now=True)
我该怎么获取某个人的推文呢?我试过
que = db.Query(Message).order('-created').filter("user['account'] = ",'Tom')
但是出现了错误。我能访问用户的属性吗?
2 个回答
0
罗伯特·克鲁因说的没错。我在你的模型中也看到了这一点。
user = db.ReferenceProperty()
我觉得应该是 user=db.ReferenceProperty(User)
6
在GQL中没有JOIN
操作。你可以查看这篇关于建模关系的文章,里面有一些其他的技巧可以使用。另外,别忘了观看在App Engine上构建可扩展复杂应用的讲座,这会非常值得你花时间去看。
根据你现在的模型,你需要先获取用户实体(或者构建它的键!),然后再用这个去查询。例如:
user = User.all(keys_only=True).filter('account', 'Tom').get() # only get one.
# or, build the key (if possible)
user = db.Key.from_path('User', 'tom') # if you make 'account' the key_name
messages = Message.all().order('-created').filter("user =", user)
另一种选择是对设计进行反规范化,把“账户”也存储在消息中:
class Message(db.Model):
user = db.ReferenceProperty()
account = StringProperty()
text = StringProperty()
created = DateTimeProperty(auto_now=True)
messages = Message.all().order('-created').filter("account =", 'tom')