微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AttributeError: 模块“app.models.PostModel”没有属性“_sa_class_manager”

如何解决AttributeError: 模块“app.models.PostModel”没有属性“_sa_class_manager”

我试图将flask-admin 添加到我的应用程序中。我收到以下错误

Traceback (most recent call last):
  File "/run/media/sanifss/4264239664238C2B/Projects/Personal/Portfolio/run.py",line 3,in <module>
    app = create_app()

  File "/run/media/sanifss/4264239664238C2B/Projects/Personal/Portfolio/app/__init__.py",line 71,in create_app
    admin.add_view(ModelView(PostModel,db.session))
  File "/home/sanifss/.local/share/virtualenvs/Portfolio-UVOeSvIO/lib/python3.9/site-packages/flask_admin/contrib/sqla/view.py",line 327,in __init__
    super(ModelView,self).__init__(model,name,category,endpoint,url,static_folder,File "/home/sanifss/.local/share/virtualenvs/Portfolio-UVOeSvIO/lib/python3.9/site-packages/flask_admin/model/base.py",line 818,in __init__
    self._refresh_cache()
  File "/home/sanifss/.local/share/virtualenvs/Portfolio-UVOeSvIO/lib/python3.9/site-packages/flask_admin/model/base.py",line 895,in _refresh_cache
    self._list_columns = self.get_list_columns()
  File "/home/sanifss/.local/share/virtualenvs/Portfolio-UVOeSvIO/lib/python3.9/site-packages/flask_admin/model/base.py",line 1035,in get_list_columns
    only_columns=self.column_list or self.scaffold_list_columns(),File "/home/sanifss/.local/share/virtualenvs/Portfolio-UVOeSvIO/lib/python3.9/site-packages/flask_admin/contrib/sqla/view.py",line 418,in scaffold_list_columns
    for p in self._get_model_iterator():
  File "/home/sanifss/.local/share/virtualenvs/Portfolio-UVOeSvIO/lib/python3.9/site-packages/flask_admin/contrib/sqla/view.py",line 354,in _get_model_iterator
    return model._sa_class_manager.mapper.iterate_properties
AttributeError: module 'app.models.PostModel' has no attribute '_sa_class_manager'

我认为这可能是 sqlAlchemy 和 Flask-Admin 之间的一些依赖问题。但无法弄清楚到底出了什么问题以及如何解决

我的后期模型

# src/models/PostModel.py
import datetime

from marshmallow import Schema,fields
from slugify import slugify

from . import db


class PostModel(db.Model):
    """
    Post Model
    """

    __tablename__ = 'posts'

    id = db.Column(db.Integer,primary_key=True)
    title = db.Column(db.String(128),nullable=False,unique=True)
    slug = db.Column(db.String(128),nullable=False)
    contents = db.Column(db.Text,nullable=False)
    owner_id = db.Column(
        db.Integer,db.ForeignKey('users.id'),nullable=False)
    created_at = db.Column(db.DateTime)
    modified_at = db.Column(db.DateTime)

    def __init__(self,data):
        self.title = data.get('title')
        self.slug = slugify(data.get('title'))
        self.contents = data.get('contents')
        self.owner_id = data.get('owner_id')
        self.created_at = datetime.datetime.utcNow()
        self.modified_at = datetime.datetime.utcNow()

    def save(self):
        db.session.add(self)
        db.session.commit()

    def update(self,data):
        for key,item in data.items():
            setattr(self,key,item)
        self.modified_at = datetime.datetime.utcNow()
        db.session.commit()

    def delete(self):
        db.session.delete(self)
        db.session.commit()

    @staticmethod
    def get_all_blogposts():
        return PostModel.query.all()

    @staticmethod
    def get_one_post(id):
        return PostModel.query.get(id)

    @staticmethod
    def get_one_post_by_slug(id):
        return PostModel.query.filter_by(slug=id).first()

    def __repr__(self):
        return '<id {}>'.format(self.id)

Db 在models/init.py

下创建
# app/models/__init__.py

from flask_bcrypt import Bcrypt
from flask_sqlalchemy import sqlAlchemy

# initialize our db
db = sqlAlchemy()
bcrypt = Bcrypt()

终于有了我的应用

import logging.config
from os import environ

from celery import Celery
from dotenv import load_dotenv
from flask import Flask
from flask_admin import Admin
from flask_admin.contrib import sqla
from flask_cors import CORS

from app.models import PostModel,usermodel

from .config import config as app_config
from .models import bcrypt,db

celery = Celery(__name__)


def create_app():
    """
    Create app
    """
    # loading env vars from .env file
    load_dotenv()
    APPLICATION_ENV = get_environment()

    logging.config.dictConfig(app_config[APPLICATION_ENV].LOGGING)

    # app initializations
    app = Flask(app_config[APPLICATION_ENV].APP_NAME)
    app.config.from_object(app_config[APPLICATION_ENV])

    CORS(app,resources={r'/api/*': {'origins': '*'}})

    celery.config_from_object(app.config,force=True)
    # celery is not able to pick result_backend and hence using
    # update
    celery.conf.update(
        result_backend=app.config['RESULT_BACKEND'])

    # Other initializations
    bcrypt.init_app(app)
    db.init_app(app)

    # migration
    from flask_migrate import Migrate
    migrate = Migrate(app,db)

    # Blueprints
    from .views.CoreView import core as core_blueprint
    app.register_blueprint(
        core_blueprint,url_prefix='/api/v1/core'
    )

    from .views.UserView import user_api as user_blueprint
    app.register_blueprint(
        user_blueprint,url_prefix='/api/v1/users'
    )

    @app.route('/',methods=['GET'])
    def index():
        """
        Blog endpoint
        """
        return 'Server is up and running'

    # Admin
    admin = Admin(app)
    admin.add_view(sqla.ModelView(PostModel,db.session))
    return app


def get_environment():
    return environ.get('APPLICATION_ENV') or 'development'

我是烧瓶和烧瓶管理员的新手,非常感谢任何帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。