Python GAE数据存储存根问题
我正在为我的Django应用程序在Google应用程序引擎上编写一些单元测试。测试通过调用Python GAE数据存储存根问题,python,django,google-app-engine,google-cloud-datastore,Python,Django,Google App Engine,Google Cloud Datastore,我正在为我的Django应用程序在Google应用程序引擎上编写一些单元测试。测试通过调用init_datastore_v3_stub使用数据存储存根,并在其中存储一些测试数据。对于简单的模型,这很好,但是当我存储一个模型B,它是模型a的子类时,我只会在作为a查询模型时得到结果。示例代码: class A(db.polymodel.PolyModel): ... class B(A): .... B().put() print A.all().count() # prints
init_datastore_v3_stub
使用数据存储存根,并在其中存储一些测试数据。对于简单的模型,这很好,但是当我存储一个模型B
,它是模型a
的子类时,我只会在作为a
查询模型时得到结果。示例代码:
class A(db.polymodel.PolyModel):
...
class B(A):
....
B().put()
print A.all().count() # prints 1
print B.all().count() # prints 0
请注意,在生产中,两行都将打印1。
有什么建议吗
更新:
问题似乎与数据库本身无关,而是与PolyModel实现有关。我注意到,B.\u实体
不包含它应该包含的'class'
值,而是包含'u class'
。它看起来像:
print B._entity # prints {... '_class'=[u'A', u'B'] ...}
这就解释了我得到的结果。
当我手动设置'class'
值时,一切正常:
b = B()
b._entity['class'] = b._entity['_class']
b.put()
print B.all().count() # prints 1
当我找到问题的原因时,我将继续调查并在此处更新。我自己找到了解决方案,这是我代码中的一个错误,我意外地将每个属性的
名称
属性覆盖为字段的类成员名称,对于PolyModel
的class
属性,它是\u class
。这发生在为测试创建模拟模型的过程中,这就是为什么我在生产中没有遇到这个问题。您可能会遇到最终的一致性。在考虑其他问题之前,你需要排除这个问题。谢谢@TimHoffman的评论。我尝试在打印之前添加sleep(10)
,结果仍然相同。我还能做些什么来排除最终的一致性呢?从刚才放置的对象中获取密钥,然后调用Get(),这将解决最终的一致性问题。