1

我有这两个数据存储:

class User(db.Model):
    name = db.StringProperty(required = True)
    password = db.StringProperty(required = True)
    email = db.EmailProperty(required = True)
    created = db.DateTimeProperty(auto_now_add = True)
    image = db.LinkProperty(required = True)

class Post(db.Model):
    post = db.StringProperty(required = True, multiline = True)
    submitter = db.IntegerProperty(required = True)
    receiver = db.IntegerProperty(required = True)
    created = db.DateTimeProperty(auto_now_add = True)

但是问题是我生成了一个用户页面,其中显示了用户收到的所有帖子,但是我以非常 SQL 和幼稚的方式执行此操作,如下所示:

ret = []
    #Get all Posts
    for p in self.getPosts():
        #If the receiver of the post is equal to uId
        if str(p.receiver) == str(uId):

            #Get submitter Details
            sDetails = self.getUserDetails(p.submitter)

            #Check that details were received
            if sDetails:
                #Add needed Details to post
                p.sName = sDetails.name
                p.sId = str(sDetails.key().id())
                p.sImage = sDetails.image

                ret.append(p)
    return ret

你们将如何改进这一点?在这种方法中我最讨厌的事情是必须通过每个帖子,这将导致系统变得非常慢一旦系统变大。

另请注意,所有帖子都存储在 memcache 中,因此我无法使用 GQL 来改善它。除非您有更好的想法将内容存储在 memcache 中,而不是我的方法……也就是说,将所有经常使用的查询放入其中,并在向数据存储添加新项目后更新缓存。

对于那些可能关注我的问题的人来说,这个项目是社交媒体的一个新概念,一旦完成就会发布一个链接:)

4

1 回答 1

2

您不必每次都从数据库中获取所有帖子;使用过滤器查询来获取与特定用户 ID 匹配的所有帖子:

q = db.Query(Post)
q.filter('receiver =', uId)

如果你现在不能这样做,因为你将每一篇文章都存储在一个内存缓存键下,也许你应该调整你的方法——它可能无法很好地扩展。使用上述查询,您可以利用 GAE 数据存储的索引和查询功能,这将始终优于直接迭代应用程序中的整个实体集。

我建议在从数据存储区生成用户页面后将它们存储在内存缓存中。

此外,在 上Post,您可以使用db.ReferencePropertyforsubmitterreceiver

class Post(db.Model):
post = db.StringProperty(required = True, multiline = True)
submitter = db.ReferenceProperty(reference_class=User, required = True)
receiver = db.ReferenceProperty(reference_class=User, required = True)
created = db.DateTimeProperty(auto_now_add = True)

https://developers.google.com/appengine/docs/python/datastore/typesandpropertyclasses#ReferenceProperty

于 2013-03-20T19:55:25.430 回答