使用Python的Google App Engine上的密钥或ID

时间:2011-01-27 23:38:30

标签: python google-app-engine

Hiya,我之前问了一个关于使用键得到完美回答的问题。

然而,现在我想知道如果为我的模型创建和使用密钥是要走的路,我的iPhone应用程序人员告诉我,我们需要INT存储在数据库中。我让我的Python代码使用Keys,现在可能不得不回溯。

我希望听到您对整个创建关键名称与自动生成ID的意见,我的iPhone应用程序可以使用这些ID而无需任何重大更改。

这是我的模特:

class User(db.Model):
   id = db.StringProperty()
   name = db.StringProperty()
   image = db.BlobProperty(default=None)

class Book(db.Model):
   image = db.BlobProperty()
   date_added = db.DateTimeProperty(auto_now_add=True)
   is_active = db.BooleanProperty(default=True)

class BookUser(db.Model):
   book = db.ReferenceProperty(Book)
   user = db.ReferenceProperty(User)
   is_active = db.BooleanProperty(default=True)

我是如何使用Keys处理它们的(下面)。 每次用户登录BookUser记录时,如果它已经不存在,则会创建。我需要将所有这些数据发送到iPhone,并将ID存储在数据库中。以下看起来相当稳固,举手认为我应该告诉iPhone开发人员“吮吸它”:)

或者可以用更好的方式解决以下问题?

### Get the Users Details
user_id = 1
user = User.get_by_key_name(user_id)
user_key = user.key().name()

### Get the latest active Book
book = Book.all().filter('is_active =', True).get()
book_key = book.key().name()

### Get latest Book for this User
bookuser_key_name = "%s:%s" % (str(book_key), str(user_key))
bookuser = BookUser.get_or_insert(bookuser_key_name)
bookuser.card = card
bookuser.user = user
bookuser.put()

2 个答案:

答案 0 :(得分:1)

您可能希望避免仅使用“id”作为字段名称。编码时可能会与数据键的id()混淆。 http://code.google.com/appengine/docs/python/datastore/keyclass.html

user_id是不错的选择。

想要使用整数的“iPhone家伙”非常关注。你真的不想依赖或使用顺序int值的id。除了在集群环境中变得棘手之外,它还会引入安全性问题,其中ID很容易猜到。

答案 1 :(得分:0)

使用键名的方式看起来很好。您的iPhone开发人员是否有一个具体原因,他不希望您使用它们?