google数据存储/python建模

2024-10-01 15:47:50 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在尝试建立一个应用程序,它的模型类似如下一个:-(虽然将两个模型合并为一个模型并加以使用是很容易的,但这在实际应用程序中并不可行)

class User(db.Model):
     username=db.StringProperty()
     email=db.StringProperty()

class UserLikes(db.Model):
      username=db.StringProperty()
      food=db.StringProperty()

目标-用户登录后输入他喜欢的食物,然后应用程序返回所有其他喜欢这种食物的用户。 现在假设一个用户Alice输入她喜欢“Pizzas”,它被存储在数据存储中。她退出登录又一次。在这一点我们在数据存储中查询她喜欢的食物,然后再次查询所有喜欢这种食物的用户。如您所见,这是两个数据存储查询,这不是最好的方法。我相信肯定会有更好的方法来做这件事。有人能帮忙吗。在

在[更新:-或可以这样做的话,我改变了第二个模型,使得用户名成为一个多值属性,所有喜欢这种食物的用户都可以存储在其中。。不过,我有点不清楚]

在[编辑:嗨,谢谢但我发现下面的两个解决方案都有点过分了。我试着像下面。请求你看看这个,并提出一些建议。我维持着同样的两张桌子,但是改变了以下:在

^{pr2}$

现在,当两个用户更新他们喜欢的相同食物时,它们会像

“披萨”-->;“爱丽丝”,“鲍勃”

我的数据库查询检索数据变得非常容易

query=db.Query(UserLikes).filter('username =','Alice').get()

然后我可以迭代如下

    for elem in query.username:
          print elem

如果有两种食物以下:在

'pizza' ----> 'Alice','Bob'
'bacon'----->'Alice','Fred'

我使用与上面相同的查询,并迭代查询,然后遍历用户名。在

我对这个很陌生,意识到这可能是错误的。请建议!在


Tags: 数据方法用户模型应用程序dbmodelusername
2条回答

除了您拥有的关系模型之外,您还可以根据您的具体用例以其他两种方式处理此问题。你在更新中有个好主意,使用ListProperty。在Relation Indexes上查看Brett Slatkin的taslk作为背景。在

您可以对包含食物列表的用户使用子实体(关系索引):

class UserLikes(db.Model):
    food = db.StringListProperty()

然后,当您创建一个UserLikes实例时,您将把它相关的用户定义为父级:

^{pr2}$

这样您就可以查询其他喜欢某种食物的用户:

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)

然而,更适合您的应用的方法是让关系成为食物的孩子:

class WhoLikes(db.Model):
    users = db.StringListProperty()

在创建类似项时,将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)

如果你有很多喜欢的人,或者有很多拥有相同喜欢的用户,你需要对这个过程进行一些调整。你将无法获取1000个用户。在

Food和User关系是一个所谓的Many-to-Many relationship,通常是用一个Join表处理的;在本例中是一个db.Model,它将用户和食物联系起来。 像这样:

class User(db.Model):
  name = db.StringProperty()

  def get_food_I_like(self):
     return (entity.name for entity in self.foods)

class Food(db.Model):
  name = db.StringProperty()

  def get_users_who_like_me(self):
    return (entity.name for entity in self.users)

class UserFood(db.Model):
  user= db.ReferenceProperty(User, collection_name='foods')
  food = db.ReferenceProperty(Food, collection_name='users')

对于给定用户实体,您可以通过以下方式检索首选食物:

^{pr2}$

对于给定食物的实体,您可以通过以下方式检索喜欢该食物的用户:

foodYYY.get_users_who_like_me()

还有另一种处理多对多关系的方法,在db.ListProperty()中存储一个键列表。在

class Food(db.Model):
  name = db.StringProperty()

class User(db.Model):
  name = db.StringProperty()
  food = db.ListProperty(db.Key)

请记住,ListProperty被限制为5.000个键,或者您不能添加非常适合于join表的有用属性(例如:表示用户对食物有多喜欢的一些星星)。在

相关问题 更多 >

    热门问题