所以,我有两个模型:作者和帖子。两者都有一个布尔字段'status'。帖子由作者完成,因此db.ReferenceProperty()字段。模型是这些:
class Authors(db.Model):
status = db.BooleanProperty(default = True)
name = db.StringProperty(required = True)
class Posts(db.Model):
status = db.BooleanProperty(default = True)
title = db.StringProperty(required = True)
content = db.TextProperty(required = True)
author = db.ReferenceProperty(Authors)
因此,当两个状态字段(引用的帖子和作者)都设置为True时,我希望能够在我的网站上列出帖子。如果我将Authors.status设置为False,则将不再显示其所有子帖子。
我知道这不起作用,但它会是这样的:
q = Posts.all()
q.filter('status =', True)
q.filter('author.status =', True)
q.run()
我知道这是一个JOIN和GAE数据存储区不支持连接,但任何想法我怎么可能这样做?提前谢谢。
答案 0 :(得分:1)
正如您所说,您无法与数据存储区建立联接。所以你只能迭代并检查状态。
您执行此操作的确切方式取决于您的数据。您可能希望首先查询作者,然后获取具有正确状态的每位作者的帖子:
all_posts = []
q = Authors.all().filter('status', True)
for author in q:
posts = Post.all().filter('author', author).filter('status', True)
all_posts.extend(posts.run())
另一种方法是获取status = True的所有作者的密钥,将它们放在一个集合中,然后遍历所有帖子并检查作者密钥是否存在:
all_posts = []
authors = set(Authors.all(keys_only=True).filter('status', True).run())
q = Post.all().filter('status', True)
for post in q:
if post._author in authors:
all_posts.append(post)
正如我所说,效率更高取决于你拥有多少不同的作者,每个作者有多少个帖子,以及每个作者的状态分布。试试它们并检查您正在生成的查询数量。