2016-09-28 41 views
0

我有一個關係問題(...),我不明白爲什麼。一對一關係SQLAlchemy與多個文件

錯誤:

「InvalidRequestError:當初始化映射器映射|用戶|用戶,表達‘BannedUser’未能找到一個名稱(」名稱「BannedUser」沒有定義「)如果這是一個類名。 ,在兩個相關類都被定義之後,考慮將這個關係()添加到類中。「

這是代碼:

用戶模型

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',但發生同樣的事情。

我不知道該怎麼做。

非常感謝您的幫助。

回答

1

back_populatesdoc),你需要指定它在關係的另一端的相關屬性,同時指定表名......同一個實體的...

我會建議與back_refdoc),它的另一端相關的屬性的護理做(這樣你就不會需要指定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') 
    ... 
+0

同樣的錯誤我在我的問題說:( –

+0

啊,對不起,(它仍然是一個在你的代碼的問題,我認爲)。它看起來與你使用'declarative_base'的方式有關。檢查這個http://stackoverflow.com/questions/7478403/sqlalchemy-classes-across-files – creativeChips

+0

發現!我只是在我的Database類中添加一個Base = declarative_base(),並將其擴展到我的模型中 –

相關問題