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
感謝您的幫助提前
謝謝。真的需要這方面的幫助 – ivan
我得到了同樣的錯誤,但使用了'secondary'和'secondaryjoin'的經典方法。你有這兩個例子嗎? – funseiki