一对一关系SQLAlchemy与多个文件



我的感情(…)有问题,我不明白为什么。

错误:

"InvalidRequestError:当初始化mapper mapper |User|users时,表达式'BannedUser'未能找到名称("name 'BannedUser' is not defined")。如果这是一个类名,请考虑在定义了两个依赖类之后将这个relationship()添加到类中。"

这是代码:

用户模型
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship
from .base import Base as BaseModel

class User(BaseModel, declarative_base()):
     __tablename__ = 'users'
     id = Column(Integer, primary_key=True)
     username = Column(String(16))
     password = Column(String(16))
     nickname = Column(String(16))
     secret_question = Column(String(50))
     secret_answer = Column(String(50))
     role = Column(Integer)
     is_banned = relationship("BannedUser", uselist=False, back_populates='users')

禁用用户模型:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey
from sqlalchemy.orm import relationship
from .base import Base as BaseModel

class BannedUser(BaseModel, declarative_base()):
     __tablename__ = 'banned_users'
     id = Column(Integer, primary_key=True)
     user_id = Column(Integer, ForeignKey('users.id'))
     user = relationship('User', back_populates='banned_users')
     reason = Column(String)
     time_end = Column(DateTime)

我尝试直接类而不是类字符串,但这也不起作用。

我试过"用户"。Id '而不是'users '。,但同样的事情发生了。

我不知道该怎么办。

提前感谢您的帮助

back_populates (doc)上,您需要指定与关系的另一端相关的属性,而您指定了表名…同一实体的…

我建议使用back_ref (doc),它负责另一端相关的属性(因此您不需要在BannedUser上指定user属性,或者相反),例如:

...
class User(BaseModel, declarative_base()):
    __tablename__ = 'users'
    ...
    is_banned = relationship("BannedUser", uselist=False, back_ref='user')
    ...

但是如果你仍然想用back_populates来做,你应该这样做:

...
class User(BaseModel, declarative_base()):
    __tablename__ = 'users'
    ...
    is_banned = relationship("BannedUser", uselist=False, back_populates='user')
    ...
class BannedUser(BaseModel, declarative_base()):
    __tablename__ = 'banned_users'
    ...
    user = relationship('User', back_populates='is_banned')
    ...

最新更新