为Google数据存储区/ Python建模
作者:互联网
嗨,我正在尝试构建一个应用程序,其模型类似于以下模型:-(虽然将两个模型合并为一个模型并使用它们很容易,但是在实际应用中这是不可行的)
class User(db.Model):
username=db.StringProperty()
email=db.StringProperty()
class UserLikes(db.Model):
username=db.StringProperty()
food=db.StringProperty()
目标-登录后的用户输入他喜欢的食物,然后该应用程序又返回所有其他喜欢该食物的用户.
现在假设用户Alice输入了她喜欢“ Pizzas”的信息,并将其存储在数据存储区中.她注销并再次登录.这时,我们在数据存储区中查询她喜欢的食物,然后再次查询所有喜欢该食物的用户.如您所见,这是两个数据存储区查询,但这不是最佳方法.我相信肯定会有更好的方法.有人可以帮忙吗?
[更新:-还是可以通过更改第二个模型来使用户名成为多值属性,以便所有喜欢该食物的用户都可以存储在其中.但是我在这里不清楚.
[编辑:-您好,谢谢您的回复,但我发现这两种解决方案在这里都有些过头了.我尝试按照以下方式进行操作.请您查看此内容并提出建议.我维护了相同的两个表,但是将它们更改如下:
class User(db.Model):
username=db.StringProperty()
email=db.StringProperty()
class UserLikes(db.Model):
username=db.ListProperty(basestring)
food=db.StringProperty()
现在,当2个用户更新他们喜欢的相同食物时,它的存储方式就像
“披萨” —-> ‘爱丽丝’,’鲍勃’
我的数据库查询来检索数据在这里变得非常容易
query=db.Query(UserLikes).filter('username =','Alice').get()
然后我可以像这样迭代
for elem in query.username:
print elem
现在,如果有以下两种食物:
'pizza' ----> 'Alice','Bob'
'bacon'----->'Alice','Fred'
我使用与上述相同的查询,并依次遍历查询和用户名.
我对此很陌生,意识到这可能是错误的.请提出建议!
解决方法:
除了拥有的关系模型之外,您还可以根据实际用例以其他两种方式处理此问题.您在更新中有个好主意,请使用ListProperty.在Relation Indexes上查看Brett Slatkin的故事,了解一些背景知识.
您可以在包含食物列表的用户上使用子实体(关系索引):
class UserLikes(db.Model):
food = db.StringListProperty()
然后,在创建UserLikes实例时,将与之相关的用户定义为父级:
likes = UserLikes(parent=user)
这样一来,您就可以查询喜欢其他食物的其他用户:
like_apples_keys = UserLikes.all(keys_only=True).filter(food='apples')
user_keys = [key.parent() for key in like_apples_keys]
users_who_like_apples = db.get(user_keys)
但是,可能更适合您的应用程序的是将Relation作为食品的孩子:
class WhoLikes(db.Model):
users = db.StringListProperty()
创建like时,将key_name设置为食物的名称:
food_i_like = WhoLikes(key_name='apples')
现在,要获得所有喜欢苹果的用户:
apple_lover_key_names = WhoLikes.get_by_key_name('apples')
apple_lovers = UserModel.get_by_key_names(apple_lover_key_names.users)
要获得与用户喜欢相同内容的所有用户,请执行以下操作:
same_likes = WhoLikes.all().filter('users', current_user_key_name)
like_the_same_keys = set()
for keys in same_likes:
like_the_same_keys.union(keys.users)
same_like_users = UserModel.get_by_key_names(like_the_same_keys)
如果您有很多喜欢的地方,或者有很多用户喜欢的地方,则需要对该过程进行一些调整.您将无法吸引成千上万的用户.
标签:google-app-engine,google-cloud-datastore,python 来源: https://codeday.me/bug/20191209/2095980.html