Как экземпляр моделей App Moall Copy App для создания нового экземпляра?

StackOverflow https://stackoverflow.com/questions/3691064

Вопрос

Я хочу реализовать простой класс 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top