2016-03-02 66 views
2

我使用两个表的Flask + SQLAlchemy + PostgreSQL。 包含用户的表格和包含目标的表格(用户想要实现的内容)。SQLAlchemy + Flask多对一的关系

models.py:

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    user_name = Column(Text) 
    email = Column(String(255), unique=True, nullable=False) 
    password = Column(String(255)) 
    # A user can only have one goal at a time 
    goal_id = Column(Integer, ForeignKey('goals.id')) 
    goal = relationship("Goal", back_populates="user") 

class Goal(Base): 
    """ Goals: Health, Fitness, Wealth, etc. """ 
    __tablename__ = 'goals' 
    id = Column(Integer(), primary_key=True) 
    name = Column(String(80), unique=True) 
    description = Column(String(255)) 
    user = relationship("User", back_populates="goal", uselist=False) 

用户只能有一次一个目标。在我的测试情况下,我第一次填充表目标:

tests.py:

for goal in ["Health", "Fitness", "Wealth"]: 
    session.add(Goal(name=goal)) 

然后,我希望能够以填充每3个用户提供了不同的目标。什么是实现这个的正确方法?

尝试(简化代码):

user = User() 
goal = Goal() 
user.goal.append(goal) 

给我:

user.goal.append(goal) 

E AttributeError: 'NoneType' object has no attribute 'append'

回答

0

您正在定义目标作为uselist=False这意味着它不被存储为一个数组。您只需要执行user.goal = goal而不是append,因为它不是以列表形式存储的。

所以不是

user = User() 
goal = Goal() 
user.goal.append(goal) 

做到这一点:

user.goal = goal 
+0

事实上,我错过了uselist =假的地步。所以现在很好。但关于这种关系。你确定吗 ? “我基于http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html上的关系定义(请参阅:多对一,双向行为..) –

+0

啊是的,我的错误我习惯于使用' backref'而不是'back_populates'。我会更新我的答案 – pech0rin

相关问题