Python 每次调用put时,auto\u now\u add属性是否都会更新?
我有一个db模型,其中一个属性有Python 每次调用put时,auto\u now\u add属性是否都会更新?,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我有一个db模型,其中一个属性有auto\u now\u add=True。但看起来它并没有像我预期的那样工作-每次调用put时它都会更新(我使用自己的key\u name,所以对put的第二次/第三次/N调用并不会真正创建新记录-只需更新它即可) 代码如下: class User(db.Model): id = db.IntegerProperty() added = db.DateTimeProperty(auto_now_add=True) name = db.St
auto\u now\u add=True
。但看起来它并没有像我预期的那样工作-每次调用put
时它都会更新(我使用自己的key\u name
,所以对put
的第二次/第三次/N调用并不会真正创建新记录-只需更新它即可)
代码如下:
class User(db.Model):
id = db.IntegerProperty()
added = db.DateTimeProperty(auto_now_add=True)
name = db.StringProperty()
...
# this handler can be called several times
def get(self):
user = User(key_name="id"+unique_user_id)
user.id = unique_user_id
user.name = current_name
user.put()
您每次都在重新创建实体,下面是代码的外观:
#This will create the object only once
return User.get_or_insert(key_name="id%d" % unique_user_id,
id=unique_user_id,
name = current_name)
#This will create the object and update some properties
#You can't change the value of key_name
user = User.get_or_insert(key_name="id%d" % unique_user_id,
id=unique_user_id)
user.name = name
user.put()
return user
通过每次覆盖实体,可以有效地创建新记录。
auto\u now
和auto\u now\u add
之间的区别由模型框架强制执行;它无法根据记录是否已经存在而采取不同的行动。相反,您应该将现有记录更新为。@ShayErlichmen,我已经添加了代码unique_user_id
,current_name
-是我从另一个(第三方)站点获得的<代码>当前_名称可以更改,所以我有时需要重新读取它。但是如果记录已经存在,它不会更新记录,对吗?我需要更新。顺便说一句@Nick数据存储需要有update_或_insert():model,这样上面的代码只会提交一次(并且在一次发送中)@ShayErlichmenget_或_insert
只是一种方便的方法;它不会做任何你不能做的事情。对于update\u或\u insert
函数也是如此。我知道,但还是很方便有一个现成的。@ShayErlichmen老实说,我希望get\u或\u insert
不存在,因为它会导致人们编写解决方案,而不需要像您的答案那样进行额外的编写,当他们可以在一次交易中完成这一切时。