在Google App Engine上使用Python的键或ID
你好,我之前问了一个关于使用键的问题,得到了很好的回答。
不过,现在我在想,为我的模型创建和使用键是不是正确的做法。我有个做iPhone应用的朋友告诉我,我们需要用整数来存储在数据库里。我已经让我的Python代码用上了键,现在可能得回头改了。
我想听听你们对创建键名和自动生成ID的看法,这样我的iPhone应用就能用,而不需要做太大的改动。
这是我的模型:
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)
下面是我用键处理这些模型的方式。每次用户登录时,如果没有现成的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
你这样使用键名看起来没问题。你的iPhone开发者有没有具体的理由不让你这么做呢?
1
你可能不想仅仅用“id”作为字段名称,因为在编码时,这可能会和数据键的id()搞混。http://code.google.com/appengine/docs/python/datastore/keyclass.html
使用user_id是个不错的选择。
你提到的“iPhone家伙”想用整数作为id,这让我很担心。你真的不想依赖或使用顺序的整数值作为id。因为在集群环境中,这样做很容易出错,而且可能会带来安全问题,让id变得容易被猜到。