代码之家  ›  专栏  ›  技术社区  ›  tarn

在google app engine datastore中通过id方法获取模型类

  •  6
  • tarn  · 技术社区  · 15 年前

    我无法训练你如何使用get-by-id从谷歌应用引擎数据存储中获取对象。

    from google.appengine.ext import db
    
    class Address(db.Model):
      description = db.StringProperty(multiline=True)
      latitude = db.FloatProperty()
      longitdue = db.FloatProperty()
      date = db.DateTimeProperty(auto_now_add=True)
    

    我可以用gql创建、放置和检索它们。

    address = Address()
    address.description = self.request.get('name')
    address.latitude = float(self.request.get('latitude'))
    address.longitude = float(self.request.get('longitude'))
    address.put()
    

    保存的地址具有的值

    >> address.key()
    aglndWVzdGJvb2tyDQsSB0FkZHJlc3MYDQw
    >> address.key().id()
    14
    

    我可以用钥匙找到它们

    from google.appengine.ext import db
    address = db.get('aglndWVzdGJvb2tyDQsSB0FkZHJlc3MYDQw')
    

    但不能通过身份证找到他们

    >> from google.appengine.ext import db
    >> address = db.Model.get_by_id(14)
    

    当我尝试时,地址是“无”

    >> Address.get_by_id(14)
    AttributeError: type object 'Address' has no attribute 'get_by_id'
    

    我怎样才能通过身份证找到?

    编辑:原来我是个白痴,想在一个叫做地址的函数中找到一个地址模型。谢谢你的回答,我已经把布兰登作为正确的答案,因为他首先得到了正确的答案,并证明这一切都应该有效。

    3 回复  |  直到 6 年前
        1
  •  21
  •   gravitation    6 年前

    我刚试过了 shell.appspot.com 它看起来很好用:

    Google Apphosting/1.0
    Python 2.5.2 (r252:60911, Feb 25 2009, 11:04:42) 
    [GCC 4.1.0]
    
    >>> class Address(db.Model):
      description = db.StringProperty(multiline=True)
      latitude = db.FloatProperty()
      longitdue = db.FloatProperty()
      date = db.DateTimeProperty(auto_now_add=True)
    
    >>> addy = Address()
    >>> addyput = addy.put()
    >>> addyput.id()
    136522L
    >>> Address.get_by_id(136522)
    <__main__.Address object at 0xa6b33ae3bf436250>
    
        2
  •  6
  •   Nick Johnson    15 年前

    应用程序的键是(kind、id_或_name)元组的列表-对于根实体,总是只有一个元素长。因此,一个ID本身并不标识一个实体——实体的类型也是必需的。当你调用db.model.get_by_id(x)时,你需要的是带有键的实体(model,x)。你想要的是调用地址。通过用键(地址,x)获取实体。

        3
  •  0
  •   Hwansoo Kim    14 年前

    您应该在get-by-id中使用long类型(“here”)。 int类型必须有错误消息。