【问题标题】:One-to-One relationship SQLAlchemy with multiple files具有多个文件的一对一关系 SQLAlchemy
【发布时间】:2017-02-06 08:19:46
【问题描述】:

我的关系有问题(...),我不明白为什么。

错误:

"InvalidRequestError: 在初始化映射器 Mapper|User|users 时,表达式 'BannedUser' 找不到名称("name 'BannedUser' is not defined")。如果这是一个类名,请考虑将此关系()添加到定义了两个依赖类之后的类。”

这是代码:

用户模型

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)

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

我尝试使用“User.id”而不是“users.id”,但发生了同样的事情。

我不知道该怎么办。

非常感谢您的帮助。

【问题讨论】:

    标签: python sqlalchemy foreign-keys relationship


    【解决方案1】:

    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')
        ...
    

    【讨论】:

    • 啊,对不起(我认为它仍然是您的代码中的一个问题)。它看起来与您使用declarative_base 的方式有关。检查这个stackoverflow.com/questions/7478403/…
    • 找到了!我只是在我的数据库类中添加一个 Base = declarative_base(),然后在我的模型中扩展它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2016-06-15
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多