GAE如何打印存储在ndb.LocalStructuredProperty中的项目

时间:2014-01-18 23:44:51

标签: google-app-engine google-cloud-datastore app-engine-ndb

使用文档中的示例,但使用LocalStructuredProperty:

class Address(ndb.Model):
    type = ndb.StringProperty() # E.g., 'home', 'work'
    street = ndb.StringProperty()
    city = ndb.StringProperty()

class Contact(ndb.Model):
    name = ndb.StringProperty()
    addresses = ndb.LocalStructuredProperty(Address, repeated=True)

guido = Contact(name='Guido',
            addresses=[Address(type='home',
                               city='Amsterdam'),
                       Address(type='work',
                               street='Spear St',
                               city='SF')])

编辑: 这实际上就是我用我的模型尝试的方式:

guido = Contact(name='Guido')
a = Address()
a.type='home'
a.city='Amsterdam' # etc etc..
guido.addresses.append(a)
guido.put()

现在说明天我要打印出地址中的项目,我在网页的网址中传递了一个contact_id,我在处理程序中尝试以下内容:

    contact_id = self.request.get('contact_id')
    contact = Contact.get_by_id(int(contact_id))
    logging.info("=====start contact addresses report===========================================")
    for item in contact.addresses:
         logging.info(item.type)
         logging.info(item.city)
    logging.info("=====finish contact addresses report===========================================")

我查看了大多数SO ndb问题,但看不到任何可以解决这个问题的问题。 我在文档中读到数据存储在不透明的blob中,我尝试了各种尝试访问项目的方法。 我最终希望能够添加,编辑和减去项目,只是为了记录我正在使用这个属性,因为它有希望在计费中“更便宜” - 但我无法测试它,直到我的应用程序启动并运行。 我知道我在这里缺少一些基本的东西,感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

看来问题是我有guido.put而不是guido.put() 当你检查时,一切看起来都不错 - 那就是内存。但是当你尝试检索时 稍后,您将只获得contact.addresses [[]]。 一个小小的错误浪费了我的时间。

答案 1 :(得分:0)

您可以按原样运行以下代码,您会看到ndb.LocalStructuredProperty中存储的项目正在正确读取:

import webapp2
from google.appengine.ext import ndb

class Address(ndb.Model):
  type = ndb.StringProperty()
  street = ndb.StringProperty()
  city = ndb.StringProperty()

class Contact(ndb.Model):
  name = ndb.StringProperty()
  addresses = ndb.LocalStructuredProperty(Address, repeated=True)

class MainHandler(webapp2.RequestHandler):
  def get(self):
    guido = Contact(name='Guido',
                    addresses=[Address(type='home',
                                       city='Amsterdam'),
                               Address(type='work',
                                       street='Spear St',
                                       city='SF')])
    guido.put()
    self.response.headers['Content-Type'] = 'text/plain'

    self.response.write('name: %s\n' % guido.name)
    for address in guido.addresses:
      self.response.write('  type: %s\n' % address.type)
      self.response.write('  city: %s\n' % address.city)

app = webapp2.WSGIApplication([
    ('/', MainHandler)
  ], debug=True)

很明显,你在实际应用程序中做错了,你可能无法正确存储实际值。