如何解决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 举报,一经查实,本站将立刻删除。