我多次重复这种模式:(我认为这不是很常见吗?)
谷歌应用引擎
# Insert if object doesn't exist, Otherwise Update Object
obj = get_or_insert('123', title='Hello World')
obj.title = 'Hello World'
obj.puts()
姜戈
# Insert if object doesn't exist, Otherwise Update Object
obj, created = Model.objects.get_or_create(id='123',
defaults={'title':'Hello World'}
if not created:
obj.title = 'Hello World'
obj.save()
如果我能打电话就好了insert_or_update
。不是吗?例如:
# AppEngine
obj = insert_or_update('123', title='Hello World')
# Django
obj = Model.objects.insert_or_update(id='123', defaults={'title': 'Hello World'})
更新
回到 App Engine文档,我找到了关于这个get_or_insert
方法做什么的片段。类似于以下内容:
def txn(key_name, **kwds):
entity = Story.get_by_key_name(key_name, parent=kwds.get('parent'))
if entity is None:
entity = Story(key_name=key_name, **kwds)
entity.put()
return entity
def get_or_insert(key_name, **kwargs):
return db.run_in_transaction(txn, key_name, **kwargs)
get_or_insert('some key', title="The Three Little Pigs")
我想知道为什么insert_or_update
在应用程序引擎和 django 中都没有创建一个方法。
App Engine 解决方法
@classmethod
def insert_or_update(cls, key_name, parent=None, **kwargs):
def _tx():
entity = cls.get_by_key_name(key_name, parent=parent)
if entity:
for key in kwargs:
setattr(entity, key, kwargs[key])
else:
entity = cls(key_name=key_name, parent=parent, **kwargs)
entity.put()
return entity
return db.run_in_transaction(_tx)