Google App Engine Python - 数据存储区:db.ReferenceProperty()的条件

时间:2014-01-03 13:08:16

标签: python google-app-engine google-cloud-datastore

所以,我有两个模型:作者和帖子。两者都有一个布尔字段'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数据存储区不支持连接,但任何想法我怎么可能这样做?提前谢谢。

1 个答案:

答案 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)

正如我所说,效率更高取决于你拥有多少不同的作者,每个作者有多少个帖子,以及每个作者的状态分布。试试它们并检查您正在生成的查询数量。