Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 应用程序引擎数据存储不理解Sql_Python_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Python 应用程序引擎数据存储不理解Sql

Python 应用程序引擎数据存储不理解Sql,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我有两个数据存储: 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.LinkPr

我有两个数据存储:

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中,而不是我的方法。。。也就是说,在数据存储中添加一个新项后,将所有常用的查询都丢弃并更新缓存


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

你不必每次都从数据库中获取所有帖子;使用筛选器查询获取与特定用户id匹配的所有帖子:

q = db.Query(Post)
q.filter('receiver =', uId)
如果你现在不能做到这一点,因为你把每一篇文章都存储在一个memcache键下,也许你应该调整你的方法——它可能无法很好地扩展。使用像上面这样的查询,您可以利用GAE数据存储的索引和查询功能,这将始终优于直接遍历应用程序中的整个实体集

我建议在从数据存储生成用户页面后,将其存储在memcache中

此外,在
Post
上,您可以使用
db.ReferenceProperty
作为
提交者
接收者

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)

嗯,很有趣。我非常喜欢这种方法!我唯一有点怀疑的是;创建新帖子时,我应该在referenceProperty中放入什么类型的数据?只是一个id为用户或整个用户对象的int?@DylanGrech整个用户对象。