使用文档中的示例,但使用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中,我尝试了各种尝试访问项目的方法。 我最终希望能够添加,编辑和减去项目,只是为了记录我正在使用这个属性,因为它有希望在计费中“更便宜” - 但我无法测试它,直到我的应用程序启动并运行。 我知道我在这里缺少一些基本的东西,感谢任何帮助。
答案 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)
很明显,你在实际应用程序中做错了,你可能无法正确存储实际值。