我尝试从数据存储区的一个表中选择一个实体,从中获取一些信息,然后将该信息放入另一个表中的实体中。 put()
和get()
方法似乎无法正常工作,我无法弄清楚原因。
aName = 'Hello'
q = firstTable.all()
q.filter("date =", datetime.date.today())
dateInfo = q.get() # get method here works fine
p = db.GqlQuery("SELECT * FROM secondTable WHERE name = '%s'" % aName)
result = p.run(limit = 1) # here, there's an error if I use get(), but no error if I use run()
result.firstProperty = dateInfo.firstProperty
result.secondProperty = dateInfo.secondProperty
result.put() # this line does not work
.run()
方法适用于p
,但.get()
不起作用。
什么可能导致这种情况?日志中的错误消息:
'_QueryIterator' object has no attribute 'put' Traceback (most recent call last): File "/base/data/home/runtimes/python27/python27_lib/versions/thir
我知道某些行不起作用的方式是,当我注释掉那些特定的行时,页面会加载并且不会抛出上述错误。
如果我尝试使用.get()
代替.run()
,则会出现此错误:
raise BadValueError('Property %s is required' % self.name)
BadValueError: Property info is required
答案 0 :(得分:3)
您的错误是因为run
导致查询运行,返回迭代器,您需要迭代结果。它不会直接返回实体。
在你的情况下,你试图更新迭代器本身,然后调用当然失败的put()
。
即使限制为1,您也需要进行迭代。
你应该使用get
,但是,你指出你收到错误:
error: raise BadValueError('Property %s is required' % self.name) BadValueError: Property info is required
这是因为您更改了模型info
中的属性并添加了required=True
,但您在数据存储区中有一些旧数据没有info
的值。
你的问题与一次尝试/改变太多事情有很大关系而没有真正了解正在发生的事情。我建议您返回并阅读有关查询及其方法的文档,并从模型中的required=True
属性中删除info
,直到您可以更新所有实体,以便info
有价值。