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整个用户对象。