python - query - pagination in flask sqlalchemy
¿Cuál es la diferencia entre declarative_base() y db.Model? (1)
En el código fuente de Flask-SQLAlchemy, la clase db.Model
se inicializa de la siguiente manera:
self.Model = self.make_declarative_base()
Y aquí está el método make_declarative_base()
:
def make_declarative_base(self):
"""Creates the declarative base."""
base = declarative_base(cls=Model, name=''Model'',
metaclass=_BoundDeclarativeMeta)
base.query = _QueryProperty(self)
return base
La metaclassBoundDeclarativeMeta es una subclase de DeclarativeMeta
de SQLAlchemy, simplemente agrega soporte para calcular un valor predeterminado para __tablename__
(el nombre de la tabla) y también para manejar binds.
La propiedad base.query
permite que los modelos basados en Flask-SQLAlchemy accedan a un objeto de consulta como Model.query
lugar de Model.query
de SQLAlchemy session.query(Model)
.
La clase de consulta _QueryProperty
también se subclasifica desde la consulta de SQLAlchemy. La subclase Flask-SQLAlchemy agrega tres métodos de consulta adicionales que no existen en SQLAlchemy: get_or_404()
, first_or_404()
y paginate()
.
Creo que estas son las únicas diferencias.
El tutorial de inicio rápido para el complemento Flask-SQLAlchemy indica a los usuarios que creen modelos de tablas que hereden la clase db.Model
, por ej.
app = Flask(__main__)
db = SQLAlchemy(app)
class Users(db.Model):
__tablename__ = ''users''
...
Sin embargo, el tutorial de SQLAlchemy y el archivo SAME-LITE le sugieren que los modelos de tabla heredan una Base
instanciada de declarative_base()
.
Base = declarative_base()
class Users(Base):
__tablename__ = ''users''
...
¿Cuál es la diferencia entre estos dos enfoques?