Автоматический идентификатор GUID key_name в модели - PullRequest
2 голосов
/ 25 ноября 2011

Я хочу, чтобы моя модель автоматически получала GUID в качестве key_name, и я использую код ниже. Это хороший подход для ее решения? Есть ли у него недостатки?

class SyncModel(polymodel.PolyModel):
    def __init__(self, key_name=None, key=None, **kwargs):
        super(SyncModel, self).__init__(key_name=str(uuid.uuid1()) if not key else None,key=key, **kwargs)

Ответы [ 2 ]

0 голосов
/ 28 ноября 2011

Переопределение __init__ в подклассе Model опасно, потому что конструктор используется платформой для восстановления экземпляров из хранилища данных, в дополнение к использованию пользовательским кодом.Если вы точно не знаете, как конструктор используется для реконструкции существующих объектов - что-то, что является внутренней деталью и может измениться в будущем - вам следует избегать ее переопределения.

Вместо этого определите метод фабрики, например:*

class MyModel(db.Model):
  @classmethod
  def new(cls, **kwargs):
    return cls(key_name=str(uuid.uuid4()), **kwargs)
0 голосов
/ 25 ноября 2011

Есть статья Ника о хуках до и после установки , которые и будут использоваться для установки key_name, я не знаю, допустим ли ваш текущий метод или нет, но по крайней мере, вы должны знать о других вариантах.

...