Наконец мне удалось решить мою проблему.Если кто-то еще сталкивается с той же проблемой, я выкладываю решение здесь.
Это отрывок, взятый с сайта SQLAlchemy :
Модельmetaclass отвечает за настройку внутренних компонентов SQLAlchemy при определении подклассов модели.Flask-SQLAlchemy добавляет некоторые дополнительные поведения через миксины;его метакласс по умолчанию DefaultMeta наследует их все.
- BindMetaMixin: bind_key извлекается из класса и применяется к таблице.См. Несколько баз данных с привязками.
- NameMetaMixin: если модель не задает имя таблицы , но указывает первичный ключ, автоматически генерируется имя.
Вы можете добавить свое собственное поведение, определив свой собственный метакласс и создав декларативную базу самостоятельно.Не забудьте по-прежнему наследовать нужные миксины (или просто наследовать от метакласса по умолчанию).
Передача декларативного базового класса вместо простого базового класса модели, как показано выше, в base_class вызовет Flask-SQLAlchemyиспользовать эту базу вместо создания базы с метаклассом по умолчанию.
from flask_sqlalchemy import SQLAlchemy
from flask_sqlalchemy.model import DefaultMeta, Model
class CustomMeta(DefaultMeta):
def __init__(cls, name, bases, d):
# custom class setup could go here
# be sure to call super
super(CustomMeta, cls).__init__(name, bases, d)
# custom class-only methods could go here
db = SQLAlchemy(model_class=declarative_base(
cls=Model, metaclass=CustomMeta, name='Model'))
Вы также можете передать любые другие аргументы, которые вы хотите объявить, чтобывардейный_баз () настроил базовый класс по мере необходимости.
В дополнение к этому, моей первоначальной целью было добавить некоторые дополнительные функции к моим моделям, которые унаследованы от db.Model .Для этого на самом деле вам не нужно использовать мета-классы.Таким образом, для этого случая мы можем расширить класс db.Model , как описано на той же веб-странице.Это пример предоставления каждой модели целочисленного первичного ключа или внешнего ключа для наследования объединенной таблицы:
from flask_sqlalchemy import Model, SQLAlchemy
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declared_attr, has_inherited_table
class IdModel(Model):
@declared_attr
def id(cls):
for base in cls.__mro__[1:-1]:
if getattr(base, '__table__', None) is not None:
type = sa.ForeignKey(base.id)
break
else:
type = sa.Integer
return sa.Column(type, primary_key=True)
db = SQLAlchemy(model_class=IdModel)
class User(db.Model):
name = db.Column(db.String)
class Employee(User):
title = db.Column(db.String)