私はこの種のパターンを何度も繰り返します:(そして私はこれは一般的ではないと思いますか?)
Google App Engine
# Insert if object doesn't exist, Otherwise Update Object
obj = get_or_insert('123', title='Hello World')
obj.title = 'Hello World'
obj.puts()
Django
# 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の両方でメソッドが作成されないのか疑問に思いました。
AppEngineの回避策
@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)