Как экземпляр моделей App Moall Copy App для создания нового экземпляра?
-
02-10-2019 - |
Вопрос
Я хочу реализовать простой класс Base Model VersionedModel для моего приложения App Engine. Я ищу шаблон, который не включает в себя явные выбора полей для копирования.
Я пробую что-то вроде этого, но это притягивает на мой вкус и еще не проверил его в производственной среде.
class VersionedModel(BaseModel):
is_history_copy = db.BooleanProperty(default=False)
version = db.IntegerProperty()
created = db.DateTimeProperty(auto_now_add=True)
edited = db.DateTimeProperty()
user = db.UserProperty(auto_current_user=True)
def put(self, **kwargs):
if self.is_history_copy:
if self.is_saved():
raise Exception, "History copies of %s are not allowed to change" % type(self).__name__
return super(VersionedModel, self).put(**kwargs)
if self.version is None:
self.version = 1
else:
self.version = self.version +1
self.edited = datetime.now() # auto_now would also affect copies making them out of sync
history_copy = copy.copy(self)
history_copy.is_history_copy = True
history_copy._key = None
history_copy._key_name = None
history_copy._entity = None
history_copy._parent = self
def tx():
result = super(VersionedModel, self).put(**kwargs)
history_copy._parent_key = self.key()
history_copy.put()
return result
return db.run_in_transaction(tx)
У кого-нибудь есть более простое очистительное решение для сохранения истории версий для моделей приложений?
РЕДАКТИРОВАТЬ: Взолнованный copy
из TX. THX @Adam Bordland для предложения.
Решение
Посмотрите на характеристики Статический метод на модельных классах. С этим вы можете получить список свойств и использовать это, чтобы получить их значения, что-то вроде этого:
@classmethod
def clone(cls, other, **kwargs):
"""Clones another entity."""
klass = other.__class__
properties = other.properties().items()
kwargs.update((k, p.__get__(other, klass)) for k, p in properties)
return cls(**kwargs)
Не связан с StackOverflow