保存ndb LocalStructured实体时App Engine BadValueError

时间:2015-11-25 06:56:40

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

我有模特

class Foo(ndb.Model):
  x = ndb.IntegerProperty()

class Bar(ndb.Model):
  foo = ndb.StructuredProperty(Foo, repeated=True)

我一直在最近,在尝试保存Bar实体时,仅在生产中,这个错误:

BadValueError: Expected Foo instance, got Foo(x=100)

我记得不久前看到这个错误,然后它消失了。这是什么原因?

2 个答案:

答案 0 :(得分:1)

问题是我在我保存模型的文件中使用models.py的相对导入,所以不知何故python认为Foo与Foo不同,因为它们位于不同的包中。我将模型导入更改为绝对导入,现在它正常工作。

答案 1 :(得分:0)

您所描述的最小版本:

from google.appengine.ext import ndb
import webapp2

class Foo(ndb.Model):
  x = ndb.IntegerProperty()

class Bar(ndb.Model):
  foo = ndb.StructuredProperty(Foo, repeated=True)

class Doit(webapp2.RequestHandler):
    def get(self):
        bar = Bar(foo=[Foo(x=100)])
        k = bar.put()
        self.response.write('Wrote %s' % k)

app = webapp2.WSGIApplication([
    ('/', Doit),
], debug=True)
正如预期的那样,

运行得很好。请添加重现问题所需的最少量代码,否则您无法帮助我们。 (理想情况下,编辑您的问题以包含一个简单,完整的应用程序来重现您的问题,并通过对此答案的评论让我知道您已经这样做了 - 谢谢!)。

顺便提一下,我注意到在主题中你提到了LocalStructured,但是在你问题的代码中,你实际上是在使用StructuredProperty - 我在这里展示的代码就像好吧,如果使用LocalStructuredProperty而不是StructuredProperty,无论如何,但是,你会很高兴澄清歧义,谢谢。