在Google App Engine上使用Python的键或ID

3 投票
2 回答
1603 浏览
提问于 2025-04-16 10:45

你好,我之前问了一个关于使用键的问题,得到了很好的回答。

不过,现在我在想,为我的模型创建和使用键是不是正确的做法。我有个做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变得容易被猜到。

撰写回答