2016-09-28 22 views
0

私の関係(...)に問題があり、その理由を理解できません。1対1の関係複数のファイルを持つSQLAlchemy

エラー:

。:これはクラス名である場合には、「(名「BannedUser」が「定義されていない)InvalidRequestErrorマッパーマッパーを初期化| |ユーザーのユーザー、式 『BannedUserは、』名前を見つけることができませんでした」両方の従属クラスが定義された後で、この関係()をクラスに追加することを検討してください。

これはコードです:

Userモデル

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) 

は、私が代わりに直接クラス文字列のクラスを試してみましたが、また動作しないこと。

「users.id」の代わりに「User.id」を試しましたが、同じことが起こりました。

私は何をすべきかわかりません。

ありがとうございました。

私がお勧めするのと同じエンティティのあなたは、テーブル名を指定しながら、関係のもう一方の端に関連しているプロパティを指定する必要があります back_populatesdoc)...オン

答えて

1

...

back_refdoc)でそれをやって、もう一方の端に関連するプロパティの世話をしている(あなたがBannedUseruserプロパティを指定する必要はありません、またはその逆)、のようなもの:

... 

class User(BaseModel, declarative_base()): 
    __tablename__ = 'users' 

    ... 
    is_banned = relationship("BannedUser", uselist=False, back_ref='user') 
    ... 

をしかし、まだやりたいのなら

... 

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

ああ、申し訳ありません(私は考えるあなたのコード内でそのまだ問題):back_populatesと、それは、このような何かを行う必要があります。 'declarative_base'を使う方法に関係しています。これを確認してくださいhttp://stackoverflow.com/questions/7478403/sqlalchemy-classes-across-files – creativeChips

+0

が見つかりました!私はデータベースクラスにBase = declarative_base()を追加し、それを私のモデルで拡張するだけです –