Python 声明性的_base()和db.Model之间有什么区别?

Python 声明性的_base()和db.Model之间有什么区别?,python,sqlalchemy,flask,bottle,flask-sqlalchemy,Python,Sqlalchemy,Flask,Bottle,Flask Sqlalchemy,Flask SQLAlchemy插件的命令用户创建继承db.Model类的表模型,例如 app = Flask(__main__) db = SQLAlchemy(app) class Users(db.Model): __tablename__ = 'users' ... 然而,瓶和瓶SQLAlchemy都建议表模型继承一个从声明性基()实例化的Base 这两种方法之间的区别是什么?查看Flask SQLAlchemy源代码,db.Model类初始化如下: self.Mode

Flask SQLAlchemy插件的命令用户创建继承
db.Model
类的表模型,例如

app = Flask(__main__)
db = SQLAlchemy(app)
class Users(db.Model):
    __tablename__ = 'users'
    ...
然而,瓶和瓶SQLAlchemy都建议表模型继承一个从
声明性基()实例化的
Base


这两种方法之间的区别是什么?

查看Flask SQLAlchemy源代码,
db.Model
类初始化如下:

self.Model = self.make_declarative_base()
下面是
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
\u BoundDeclarativeMeta
元类是SQLAlchemy的
DeclarativeMeta
的一个子类,它只是添加了对计算
\u tablename\u
(表名)的默认值以及处理绑定的支持

base.query
属性使基于SQLAlchemy的模型能够作为
Model.query
而不是SQLAlchemy的
session.query(Model)
访问查询对象

\u QueryProperty
查询类也是SQLAlchemy查询的子类。Flask SQLAlchemy子类添加了SQLAlchemy中不存在的三个附加查询方法:
get\u或_404()
first\u或_404()
paginate()


我相信这是唯一的区别。

我今天只是在搜索这个我已经开发了一年左右的应用程序,最初是基于你的“Mega Flask教程”,它使用db.Model,而不是显式使用Base=Declarative\u Base。我感到困惑,因为我的模型都清楚地使用了声明性扩展,但我从未调用过声明性的_base()。谢谢你的解释!是否可以在一个用户模型中使用db.Model,在地址模型中使用Base。例如:-类用户(db.Model),类地址(Base)?不确定,但我猜有些事情是行不通的。Flask SQLAlchemy向
db.Model
类中的基添加了一些行为,因此任何直接从声明性基继承的模型都不会有这种行为。
def make_declarative_base(self):
    """Creates the declarative base."""
    base = declarative_base(cls=Model, name='Model',
                            metaclass=_BoundDeclarativeMeta)
    base.query = _QueryProperty(self)
    return base