一对一关系 SQLAlchemy 与多个文件
One-to-One relationship SQLAlchemy with multiple files
我的人际关系有问题(...),我不明白为什么。
错误:
"InvalidRequestError: When initializing mapper Mapper|User|users, expression 'BannedUser' failed to locate a name ("name 'BannedUser' is not defined"). 如果这是一个 class 名字,考虑在 both dependent classes 已被定义。"
这是代码:
用户模型
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)
我尝试直接 class 而不是 class 字符串,但这也不起作用。
我试过 'User.id' 而不是 'users.id',但同样的事情发生了。
我不知道该怎么办。
在此先感谢您的帮助。
在 back_populates
(doc) 上,您需要指定关系另一端相关的 属性,同时指定 table 名称...属于同一实体...
我建议使用 back_ref
(doc),它会处理与另一端相关的 属性(因此您无需指定 user
属性 在 BannedUser
上,或相反),例如:
...
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')
...
我的人际关系有问题(...),我不明白为什么。
错误:
"InvalidRequestError: When initializing mapper Mapper|User|users, expression 'BannedUser' failed to locate a name ("name 'BannedUser' is not defined"). 如果这是一个 class 名字,考虑在 both dependent classes 已被定义。"
这是代码:
用户模型
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)
我尝试直接 class 而不是 class 字符串,但这也不起作用。
我试过 'User.id' 而不是 'users.id',但同样的事情发生了。
我不知道该怎么办。
在此先感谢您的帮助。
在 back_populates
(doc) 上,您需要指定关系另一端相关的 属性,同时指定 table 名称...属于同一实体...
我建议使用 back_ref
(doc),它会处理与另一端相关的 属性(因此您无需指定 user
属性 在 BannedUser
上,或相反),例如:
...
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')
...