我需要在更新之前检查该项目是否在数据存储中。
我有 2 个列表:UNIQUES = ["B","K","V"] 和 COUNTS = [5, 10, 3]
这是模型:
class Rep(db.Model):
mAUTHOR = db.UserProperty(auto_current_user=True)
mUNIQUE = db.TextProperty()
mCOUNT = db.IntegerProperty()
mDATE = db.DateTimeProperty(auto_now_add=True)
这个函数更新数据库:
def write_to_db(S, C):
REP = Rep(mUNIQUE=S, mCOUNT=C)
db.put(REP)
受此启发page我尝试:
for i in range(len(UNIQUES)):
C_QUERY = Rep.all()
C_QUERY.filter("mAUTHOR =", user)
C_QUERY.filter("mUNIQUE =", UNIQUES[i])
C_RESULT = C_QUERY.fetch(1)
if C_RESULT:
C = C_RESULT.mCOUNT + COUNTS[i]
S = db.Text(UNIQUES[i])
write_to_db(S,C)
else:
C = COUNTS[i]
S = UNIQUES[i]
write_to_db(S, C)
但是结果不是我所期望的。 C_RESULT 始终为空;并没有更新,而是创建了一条新记录。我究竟做错了什么?谢谢!
EDIT3:问题已解决
根据 David Underhill 的评论,我更新了代码,现在可以使用了。
if C_RESULT:
rep=C_RESULT[0]
rep.mCOUNT+=COUNTS[i]
rep.put()
EDIT2:相关问题
我如何更新此查询并用更新后的信息将其放回原处?
C_QUERY = Rep.all()
C_QUERY.filter("mAUTHOR =", user)
C_QUERY.filter("mUNIQUE =", UNIQUES[i])
C_RESULT = C_QUERY.fetch(1)
我想更改 mCOUNT,然后将其写入数据存储。我该怎么做?这看起来与他们在 this page 中所做的完全相同但我无法让它发挥作用。感谢您的帮助。
编辑
我根据 David Underhill 的回答更新了代码。这解决了问题(但功能不正确。我不确定这是否应该是一个不同的问题)。
for i in range(len(UNIQUES)):
C_QUERY = Rep.all()
C_QUERY.filter("mAUTHOR =", user)
C_QUERY.filter("mUNIQUE =", UNIQUES[i])
C_RESULT = C_QUERY.fetch(1)
if C_RESULT:
C = C_RESULT[0].mCOUNT + COUNTS[i]
S = UNIQUES[i]
write_to_db(S, C)
else:
C = COUNTS[i]
S = UNIQUES[i]
write_to_db(S, C)
请您参考如下方法:
问题是查询试图过滤 mUNIQUE。但是,您将 mUNIQUE 声明为 db.TextProperty这是从不编入索引的。因此,您的查询永远找不到任何结果。
解决方案:将mUNIQUE 改为db.StringProperty (默认情况下被编入索引)。
您还应该考虑在 transaction 中更新 Rep - 如果两个请求同时尝试更新同一个实体,当前代码可能无法添加 COUNTS[i] 属性。
此外,您可以将 S = db.Text(UNIQUES[i]) 更新为简单的 S = UNIQUES[i]。
