季布, 2023-09-21 15:29 采纳率: 36.1%
浏览 31
已结题

python flask 报错


class RoleModel(db.Model, SerializerMixin):
    serialize_only = ("id", "name", "desc", "create_time")
    __tablename__ = 'role'
    __table_args__ = {'extend_existing': True}
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), nullable=False)
    desc = db.Column(db.String(200),nullable=True)
    create_time = db.Column(db.DateTime,default=datetime.now)
    permissions = db.Column(db.Integer,default=Permission.VISITOR)



class UserModel(db.Model,SerializerMixin):
    serialize_rules = ("-_password", )
    __tablename__ = "user"
    __table_args__ = {'extend_existing': True}
    # shortuuid  正常来说主键都是整型和自增长的,但是再商业网站事不合适的,比如用户中心 用户的主键 能猜出网站多少人,通过自增长的id
    id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='用户id')
    # email = db.Column(db.String(50), unique=True, nullable=False)
    username = db.Column(db.String(50), nullable=False)
    _password = db.Column(db.String(200), nullable=False)
    avatar = db.Column(db.String(100))
    signature = db.Column(db.String(100))
    join_time = db.Column(db.DateTime, default=datetime.now)
    is_staff = db.Column(db.Boolean, default=False)
    is_active = db.Column(db.Boolean, default=True)
    role_id = db.Column(db.Integer, db.ForeignKey("role.id"))

    role = db.relationship("RoleModel", backref=db.backref("users"))

报错


sqlalchemy.exc.InvalidRequestError: Multiple classes found for path "RoleModel" in the registry of this declarative base. Please use a fully module-qualified path.
  • 写回答

14条回答 默认 最新

  • 前网易架构师-高司机 游戏服务器领域优质创作者 2023-09-21 16:20
    关注

    假设你的文件路径如下 database/models/family_1.py
    你要这样用:

    db.relationship("database.models.family_1.RoleModel", backref=db.backref("users")) 
    
    评论
  • 到点就困告 2023-09-21 15:32
    关注

    通常发生在你在同一个SQLAlchemy declarative base中注册了多个相同类名的模型。SQLAlchemy使用类名(字符串形式)作为模型在数据库中的唯一标识符,所以每个模型必须有一个唯一的类名。

    评论
  • xybf 2023-09-21 15:35
    关注

    这个 可能对你有帮助

    评论
  • 专家-赤兔[在线] 2023-09-21 15:48
    关注

    引用 皆我百晓生 小程序回应内容作答:
    这个错误通常是由于在SQLAlchemy的声明式基类中发现了同名的类而引起的。错误提醒你在注册过程中有多个路径为"RoleModel"的类存在。

    要解决此问题,你可以尝试以下几步:

    1. 确保在你的代码中没有导入重复的模块或类,并且每个类的名称唯一。

    2. 使用完全模块限定的路径来引用类。在你的代码中,替换RoleModel为完全模坐标限定的类名,比如app.models.RoleModelapp.models.UserModel

    例如:

    class RoleModel(db.Model, SerializerMixin):
        # ...
     
    class UserModel(db.Model, SerializerMixin):
        # ...
    
    1. 如果你的项目中使用了多个包(packages),请确保每个包中的模型类都有唯一的名称,并且在引用时使用完全模块限定的路径。

    2. 如果你在上下文中有多个数据库会话,确保每个会话使用不同的声明式基类,并且每个基类只包含相关的类。

    以上是解决此错误的常见步骤。如果仍然有问题,请提供更多的代码和详细信息,以便我能更好地帮助你。

    评论
  • 季布, 2023-09-21 15:58
    关注

    img

    注释了这行就可以正常使用,但是我需要这个

    评论
  • Leodong. 2023-09-21 16:32
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    这个错误是因为在 SQLAlchemy 的注册表中找到了多个 "RoleModel" 类。请确保每个模型类都在一个单独的模块中定义,并使用完全限定的路径。

    解决方法:

    1. 确保每个模型类(如 RoleModelUserModel)都在一个单独的 Python 文件中定义,例如 role_model.pyuser_model.py
    2. 在引用这些模型类时,使用完全限定的路径,例如 RoleModelUserModel

    示例:

    role_model.py 文件中:

    from app import db
    from flask_sqlalchemy import SQLAlchemy
    from .serializer_mixin import SerializerMixin
    
    db = SQLAlchemy()
    
    class RoleModel(db.Model, SerializerMixin):
        serialize_only = ("id", "name", "desc", "create_time")
        __tablename__ = 'role'
        __table_args__ = {'extend_existing': True}
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        name = db.Column(db.String(50), nullable=False)
        desc = db.Column(db.String(200),nullable=True)
        create_time = db.Column(db.DateTime,default=datetime.now)
        permissions = db.Column(db.Integer,default=Permission.VISITOR)
    

    user_model.py 文件中:

    from app import db
    from flask_sqlalchemy import SQLAlchemy
    from .serializer_mixin import SerializerMixin
    
    db = SQLAlchemy()
    
    class UserModel(db.Model, SerializerMixin):
        serialize_rules = ("-_password", )
        __tablename__ = "user"
        __table_args__ = {'extend_existing': True}
        id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='用户id')
        username = db.Column(db.String(50), nullable=False)
        _password = db.Column(db.String(200), nullable=False)
        avatar = db.Column(db.String(100))
        signature = db.Column(db.String(100))
        join_time = db.Column(db.DateTime, default=datetime.now)
        is_staff = db.Column(db.Boolean, default=False)
        is_active = db.Column(db.Boolean, default=True)
        role_id = db.Column(db.Integer, db.ForeignKey("role.id"))
    
        role = db.relationship("RoleModel", backref=db.backref("users"))
    

    在其他地方引用这些模型类时,使用完全限定的路径,例如:

    from app.role_model import RoleModel
    from app.user_model import UserModel
    

    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论
  • 数据大魔王 2023-09-21 16:35
    关注

    在关联模型时,确保使用完全限定的路径引用模型。这意味着在关联中使用模块名称来引用模型,而不仅仅是类名。

    role = db.relationship("your_module_name.RoleModel", backref=db.backref("users"))
    

    将your_module_name替换为包含RoleModel类的模块名称。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-21 19:00
    关注

    【以下回答由 GPT 生成】

    问题分析: 根据提供的代码,没有具体的报错信息,所以无法确定具体的问题。但根据代码的结构来看,可能会出现以下几个问题:

    1. 可能在导入模块时出错,比如db模块没有正确导入。
    2. 可能在类的定义中存在错误,比如缺少某个属性或方法。
    3. 可能是数据库连接或查询操作时出现问题。

    解决方案: 1. 检查代码开头是否正确导入了相关的模块,比如from flask import Flaskfrom flask_sqlalchemy import SQLAlchemy。 2. 检查每个类的定义是否完整且正确,特别是检查每个类的属性和方法是否正确。 3. 检查数据库连接是否正确,包括数据库的地址、用户名和密码等。 4. 如果有报错信息,请提供报错信息,以便更准确地诊断和解决问题。

    如果以上解决方案都不能解决问题,请提供报错信息,以便更准确定位并解决问题。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
  • 关注

    如果你确定是唯一的,请把迁徙记录清空,重新生成迁徙,再试试运行,如果"RoleModel"类位于名为"models"的模块中,你可以使用"models.RoleModel"来代替RoleModel

    评论
  • 小明说Java 2023-09-22 10:15
    关注

    报错内容贴出来吧,是不是flask没有引入啊

    评论
  • 心梓知识 2023-09-23 01:49
    关注

    结合GPT给出回答如下请题主参考
    在提供的代码中,有一个很明显的语法错误,即在 serialize_only 中字符串 "create_tim" 的结尾处少了一个字母 "e",应该为 "create_time"

    正确的代码应该如下所示:

    class RoleModel(db.Model, SerializerMixin):
        serialize_only = ("id", "name", "desc", "create_time")
    

    如果修改了这个错误,仍然有报错信息,请提供完整的报错信息,以便进一步排查问题。

    评论
  • 想你依然心痛 全栈领域新星创作者 2023-09-25 10:04
    关注

    这个错误是因为在模型中引用了多个类似的名称的模型,导致 SQLAlchemy 无法确定要使用哪个模型。解决这个问题的方法是使用完全限定的模型路径,例如:

    class UserModel(db.Model, SerializerMixin):
        serialize_rules = ("-_password", )
        __tablename__ = "user"
        __table_args__ = {'extend_existing': True}
        id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='用户id')
        username = db.Column(db.String(50), nullable=False)
        _password = db.Column(db.String(200), nullable=False)
        avatar = db.Column(db.String(100))
        signature = db.Column(db.String(100))
        join_time = db.Column(db.DateTime, default=datetime.now)
        is_staff = db.Column(db.Boolean, default=False)
        is_active = db.Column(db.Boolean, default=True)
        role_id = db.Column(db.Integer, db.ForeignKey("myapp.models.RoleModel.id"))
    
        role = db.relationship("myapp.models.RoleModel", backref=db.backref("users"))
    

    在此示例中,role_idrole 属性在引用 RoleModel 类时都使用了完全限定的路径。注意,myapp 应该替换为你的应用程序名称。这个错误是因为在模型中引用了多个类似的名称的模型,导致 SQLAlchemy 无法确定要使用哪个模型。解决这个问题的方法是使用完全限定的模型路径,例如:

    class UserModel(db.Model, SerializerMixin):
        serialize_rules = ("-_password", )
        __tablename__ = "user"
        __table_args__ = {'extend_existing': True}
        id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='用户id')
        username = db.Column(db.String(50), nullable=False)
        _password = db.Column(db.String(200), nullable=False)
        avatar = db.Column(db.String(100))
        signature = db.Column(db.String(100))
        join_time = db.Column(db.DateTime, default=datetime.now)
        is_staff = db.Column(db.Boolean, default=False)
        is_active = db.Column(db.Boolean, default=True)
        role_id = db.Column(db.Integer, db.ForeignKey("myapp.models.RoleModel.id"))
    
        role = db.relationship("myapp.models.RoleModel", backref=db.backref("users"))
    

    在此示例中,role_idrole 属性在引用 RoleModel 类时都使用了完全限定的路径。注意,myapp 应该替换为你的应用程序名称。

    评论
  • bug菌¹ Java领域优质创作者 2023-09-25 23:47
    关注

    该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


    这个错误是因为出现了多个类使用同一个名称 "RoleModel",导致导入时无法区分使用哪个类。在 Flask 中使用 SQLAlchemy 模块时,建议使用全限定名,在类名前面加上模块名,以避免同名类的冲突。你可以尝试在 UserModel 类中将 RoleModel 改为全限定名,示例代码如下:

    class UserModel(db.Model, SerializerMixin):
        serialize_rules = ("-_password", )
        __tablename__ = "user"
        __table_args__ = {'extend_existing': True}
        # shortuuid  正常来说主键都是整型和自增长的,但是再商业网站事不合适的,比如用户中心 用户的主键 能猜出网站多少人,通过自增长的id
        id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='用户id')
        # email = db.Column(db.String(50), unique=True, nullable=False)
        username = db.Column(db.String(50), nullable=False)
        _password = db.Column(db.String(200), nullable=False)
        avatar = db.Column(db.String(100))
        signature = db.Column(db.String(100))
        join_time = db.Column(db.DateTime, default=datetime.now)
        is_staff = db.Column(db.Boolean, default=False)
        is_active = db.Column(db.Boolean, default=True)
        role_id = db.Column(db.Integer, db.ForeignKey("my_module.role.id"))  # 更改为全限定名
     
        role = db.relationship("my_module.RoleModel", backref=db.backref("users"))  # 更改为全限定名
    

    你需要根据实际情况将 my_module 改为你的模块名称。这样可以避免同名类的冲突。

    评论
  • yy64ll826 2023-09-26 10:25
    关注

    python - flask 多对多关系导致 "Multiple classes found for path"
    类似的,可以参考下
    https://www.coder.work/article/2403550

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月28日
  • 创建了问题 9月21日

悬赏问题

  • ¥30 哈夫曼编码译码器打印树形项目
  • ¥20 求完整顺利登陆QQ邮箱的python代码
  • ¥15 怎么下载MySQL,怎么卸干净原来的MySQL
  • ¥15 网络打印机Ip地址自动获取出现问题
  • ¥15 求局部放电案例库,用于预测局部放电类型
  • ¥100 QT Open62541
  • ¥15 stata合并季度数据和日度数据
  • ¥15 谁能提供rabbitmq,erlang,socat压缩包,记住版本要对应
  • ¥15 Vue3 中使用 `vue-router` 只能跳转到主页面?
  • ¥15 用QT,进行QGIS二次开发,如何在添加栅格图层时,将黑白的矢量图渲染成彩色