2017-09-02 23 views
1

我要發佈一個瓶包裝包括這一個:如何構建使用時在應用程序或數據庫中註冊的Flask庫?

class Model(DB.Model): 
    __abstract__ = True 

    id = DB.Column(DB.Integer, primary_key=True) 
    created_at = DB.Column(DB.DateTime, default=datetime.utcnow, nullable=False) 
    updated_at = DB.Column(DB.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) 

    def __init__(self, **kwargs): 
     DB.Model.__init__(self, **kwargs) 

    @classmethod 
    def create(cls, **kwargs): 
     instance = cls(**kwargs) 
     return instance.save() 

    @classmethod 
    def delete_all(cls, **kwargs): 
     all_objs = cls.query.all() 
     for obj in all_objs: 
      obj.delete() 

但用戶都會有自己的DB項目。我在燒瓶裏看到過你可以做像this_package.init_app(myapp)或類似的東西,這很好。

但是這些庫的作者是如何構建它們的包的,所以你可以在應用程序上註冊它(或者在我的情況下爲db),它只是工作?

回答

0

到目前爲止,我帶着一個採用DB的getter,假設DB對象將被導入到他們的模型文件中。它不是完美的,但應該工作:

def get_model(DB): 

    class Model(DB.Model): 
     __abstract__ = True 

     id = DB.Column(DB.Integer, primary_key=True) 
     created_at = DB.Column(DB.DateTime, default=datetime.utcnow, nullable=False) 
     updated_at = DB.Column(DB.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) 

     def __init__(self, **kwargs): 
      DB.Model.__init__(self, **kwargs) 

     @classmethod 
     def create(cls, **kwargs): 
      instance = cls(**kwargs) 
      return instance.save() 

     @classmethod 
     def delete_all(cls): 
      all_objs = cls.query.all() 
      for obj in all_objs: 
       obj.delete() 

     @classmethod 
     def all(cls): 
      return cls.query.all() 

     @classmethod 
     def newest(cls, field_name): 
      return cls.query.order_by('{field_name} desc'.format(field_name=field_name)).limit(1) 

     @classmethod 
     def oldest(cls, field_name): 
      return cls.query.order_by('{field_name} asc'.format(field_name=field_name)).limit(1) 

     def update(self, commit=True, **kwargs): 
      for attr, value in kwargs.iteritems(): 
       setattr(self, attr, value) 
      return commit and self.save() or self 

     def save(self, commit=True): 
      DB.session.add(self) 
      if commit: 
       DB.session.commit() 
      return self 

     def delete(self, commit=True): 
      DB.session.delete(self) 
      return commit and DB.session.commit() 

    return Model 

然後

from myapp.extensions import DB 
from flask_easy_model import get_model 

MyModel = get_model(DB) 

我讀代碼flask-cache及其init_app()高於我的頭至今。我會很感激任何答案

相關問題