2013-10-28 74 views
2

我是sqlAlchemy的新手,我試圖在我的Flask應用程序中創建一個手動對象關係映射到已經存在的postgresql數據庫。我正在使用this tutorial。但是它沒有說明如何使用backref在模型之間建立關係。這是我迄今爲止的models.py類,唯一給我帶來麻煩的是backref。我試圖在用戶和F_League(一個用戶的許多幻想聯盟)之間建立一對多的關係。當我運行我的文件models.py,我得到以下錯誤:燒瓶sqlAlchemy手冊ORM:'RelationshipProperty'對象沒有'parent'屬性

<User u'ivan'> 
<F_League u'First Fantasy League'> 
Traceback (most recent call last): 
    File "app/models.py", line 86, in <module> 
    print u1.leagues 
    File "/home/ivan-manolov/Documents/fft/.env/local/lib/python2.7/site-packages/sqlalchemy/orm/properties.py", line 729, in __str__ 
    return str(self.parent.class_.__name__) + "." + self.key 
AttributeError: 'RelationshipProperty' object has no attribute 'parent' 

這是我的models.py文件:

from sqlalchemy import create_engine, MetaData 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship, backref, mapper 
from sqlalchemy import * 
from sqlalchemy.orm import scoped_session, sessionmaker 

engine = create_engine('postgresql://nfldb:[email protected]/nfldb', convert_unicode=True, echo=False) 
metadata=MetaData() 
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) 

def init_db(): 
    metadata.create_all(bind=engine) 

class User(object): 
     query=db_session.query_property() 
     leagues=relationship("F_League",backref="fowner",lazy="dynamic") 
    def __init__(self, user_id=None, user_name=None, first_name=None, last_name=None, email=None, password=None, last_sign_out=None): 
     self.user_id= user_id 
     self.user_name=user_name 
     self.first_name= first_name 
     self.last_name= last_name 
     self.email= email 
     self.password=password 
     self.last_sign_out= last_sign_out 


    #def set_password(self, password): 
     # self.pwdhash = generate_password_hash(password) 

     def check_password(self, password): 
      return self.password==password 

     def is_authenticated(self): 
      return True 

     def is_active(self): 
      return True 

     def is_anonymous(self): 
      return False 

     def get_id(self): 
      return unicode(self.user_id) 

    def __repr__(self): 
      return '<User %r>' % (self.user_name) 

users=Table('users',metadata, 
    Column('user_id', Integer, primary_key=True), 
    Column('user_name', String, unique=True, nullable=False), 
    Column('last_name', String, nullable=False), 
    Column('email', String,unique=True, nullable=False), 
    Column('password', String), 
    Column('last_sign_out', DateTime), 

    ) 
mapper(User, users) 

class F_League(object): 
    query=db_session.query_property() 

    def __init__(self, league_id=None, user_id=None, league_name=None): 
     self.league_id=league_id 
     self.user_id=user_id 
     self.league_name=league_name 

    def __repr__(self):              
     return '<F_League %r>' % (self.league_name) 

fleagues=Table("f_league",metadata, 
     Column('league_id', Integer, primary_key=True), 
     Column('user_id', Integer, ForeignKey('users.user_id')), 
     Column('league_name',String, unique=True) 
     ) 
mapper(F_League, fleagues) 



if __name__=="__main__": 
    result=User.query.filter_by(user_name="ivan").first() 
     print result 
     league=db_session.query(F_League).join(User).filter_by(user_id=1).first() 
     print league 
     u1=User() 
     f1= F_League() 
     print u1.leagues 

     # many1= db_session.query(User.leagues).join(User).filter_by(user_id=1).first() 
     #print many1 

感謝您的幫助提前

回答

4

你」重新錯誤地混合使用declarativeclassical映射,當你這樣做時:

class User(object): 
    query=db_session.query_property() 

    # this is wrong 
    leagues=relationship("F_League",backref="fowner",lazy="dynamic") 

    # ... 

users=Table('users',metadata, 
    # ... 
) 

mapper(User, users) 

這裏是你的兩個選擇。

  1. 聲明:

    Base = declarative_base() 
    
    class User(Base): 
        __tablename__ = 'users' 
    
        user_id = Column(Integer, priamry_key=True) 
        user_name = Column(String) 
    
        # ... 
    
        leagues=relationship("F_League",backref="fowner",lazy="dynamic") 
    
  2. 經典:

    class User(object): 
        query=db_session.query_property() 
    
        # ... 
    
    users=Table('users',metadata, 
        # ... 
    ) 
    
    mapper(User, users, properties={ 
        "leagues": relationship(F_League, backref="fowner", lazy="dynamic") 
    }) 
    
+0

謝謝。真的需要這方面的幫助 – ivan

+0

我得到了同樣的錯誤,但使用了'secondary'和'secondaryjoin'的經典方法。你有這兩個例子嗎? – funseiki

相關問題