Python 每次调用put时,auto\u now\u add属性是否都会更新?

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

我有一个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.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,这样上面的代码只会提交一次(并且在一次发送中)@ShayErlichmen
get_或_insert
只是一种方便的方法;它不会做任何你不能做的事情。对于
update\u或\u insert
函数也是如此。我知道,但还是很方便有一个现成的。@ShayErlichmen老实说,我希望
get\u或\u insert
不存在,因为它会导致人们编写解决方案,而不需要像您的答案那样进行额外的编写,当他们可以在一次交易中完成这一切时。