[Google App Engine]如何使用filter()?

1 投票
2 回答
888 浏览
提问于 2025-04-16 14:06

我刚开始学习使用谷歌的应用引擎,想做一个类似推特的东西。

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')

撰写回答