编程语言
首页 > 编程语言> > 为Google数据存储区/ Python建模

为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