Python 3.x Flask SQL Alchemy多个连接路径和一对多关系

Python 3.x Flask SQL Alchemy多个连接路径和一对多关系,python-3.x,flask,flask-sqlalchemy,Python 3.x,Flask,Flask Sqlalchemy,我试图在Flask中创建一个任务管理应用程序,遇到了以下问题 我有三种型号,用户,任务和项目。我希望用户能够创建任务并将其分配给其他用户。这需要在任务和用户模型之间有多个联接 以前,在尝试实现此功能之前,我有一个从用户到任务的一对多关系,该关系运行良好,下面是两个原始模型 class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True)

我试图在Flask中创建一个任务管理应用程序,遇到了以下问题

我有三种型号,
用户
任务
项目
。我希望用户能够创建任务并将其分配给其他用户。这需要在
任务
用户
模型之间有多个联接

以前,在尝试实现此功能之前,我有一个从
用户
任务
的一对多关系,该关系运行良好,下面是两个原始模型

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=True )
    email = db.Column(db.String(120), unique=True, nullable=True)
    password_hash = db.Column(db.String(128))

    tasks = db.relationship('Task', backref='author', lazy='dynamic') # one user has many tasks
    projects = db.relationship('Project', backref='author', lazy='dynamic') # one user has many projects

class Task(UserMixin, db.Model):
    __tablename__ = 'tasks'
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.String(128))
    due = db.Column(db.DateTime, index=True)
    done = db.Column(db.Boolean, default=False)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id')) # task belongs to user
    project_id = db.Column(db.Integer, db.ForeignKey('projects.id')) # task belongs to project
在之后,我将
assigned_to_id
列添加到任务,并将
assigned_tasks
列添加到用户

我的型号如下:

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=True )
    email = db.Column(db.String(120), unique=True, nullable=True)
    password_hash = db.Column(db.String(128))
    tasks_id = db.Column(db.Integer, db.ForeignKey('tasks.id'))
    assigned_tasks_id = db.Column(db.Integer, db.ForeignKey('tasks.id'))

    tasks = db.relationship('Task', foreign_keys="User.tasks_id", backref='author') # one user has many tasks
    assigned_tasks = db.relationship('Task', foreign_keys="User.tasks_id", backref='assigned_to') # one user has many tasks
    projects = db.relationship('Project', backref='author', lazy='dynamic') # one user has many projects

class Task(UserMixin, db.Model):
    __tablename__ = 'tasks'
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.String(128))
    due = db.Column(db.DateTime, index=True)
    done = db.Column(db.Boolean, default=False)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id')) # task belongs to user
    assigned_to_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    project_id = db.Column(db.Integer, db.ForeignKey('projects.id')) # task belongs to project
由于我对需要分配的任务或需要分配任务的用户没有限制,所以我假设我应该能够像以前一样继续创建用户和任务。但是现在,当我尝试与作者创建任务时,我得到了一个错误

>>> u = User(email='test@example.com', password='password')
>>> t = Task(body='New Task', author=u)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "<string>", line 4, in __init__
  File "/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site-packages/sqlalchemy/orm/state.py", line 417, in _initialize_instance
    manager.dispatch.init_failure(self, args, kwargs)
  File "/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 249, in reraise
    raise value
  File "/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site-packages/sqlalchemy/orm/state.py", line 414, in _initialize_instance
    return manager.original_init(*mixed[1:], **kwargs)
  File "/Users/Jasmine/projects/flask/tasky/app/models.py", line 67, in __init__
    super(Task, self).__init__(**kwargs)
  File "/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site-packages/sqlalchemy/ext/declarative/base.py", line 700, in _declarative_constructor
    setattr(self, k, kwargs[k])
  File "/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 229, in __set__
    instance_dict(instance), value, None)
  File "/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 1040, in set
    given, wanted))
TypeError: Incompatible collection type: User is not list-like
>>u=User(email=)test@example.com“,password='password')
>>>t=Task(body='newtask',author=u)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第4行,在_init中__
文件“/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site packages/sqlalchemy/orm/state.py”,第417行,在实例中
manager.dispatch.init_失败(self、args、kwargs)
文件“/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site packages/sqlalchemy/util/langhelpers.py”,第66行,在退出时__
兼容性(exc_类型、exc_值、exc_tb)
文件“/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site packages/sqlalchemy/util/compat.py”,第249行,在reraise中
增值
文件“/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site packages/sqlalchemy/orm/state.py”,第414行,在实例中
退货经理。原始初始(*混合[1:],**kwargs)
文件“/Users/Jasmine/projects/flask/tasky/app/models.py”,第67行,在__
超级(任务,自我)。\uuuuu初始化(**kwargs)
文件“/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site packages/sqlalchemy/ext/declarative/base.py”,第700行,位于声明性构造函数中
setattr(self,k,kwargs[k])
文件“/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site packages/sqlalchemy/orm/attributes.py”,第229行,在__
实例(实例,值,无)
文件“/Users/Jasmine/projects/flask/tasky/venv/lib/python3.7/site packages/sqlalchemy/orm/attributes.py”,第1040行,在集合中
给予、通缉)
TypeError:不兼容的集合类型:用户与列表不同

我可能误解了这里的错误,但在我看来,现在每个任务都需要不止一个作者。如何保持一对多的关系,使每项任务仍然只需要一位作者?

由于我的声誉,我无法添加评论,但是

这里被接受的答案应该对你有帮助。 还有

任务类中不存在作者变量,而用户类中不存在作者变量

您需要将用户附加到任务。 您可能需要检查代码,因为类之间的关系似乎不正确。否则我就错了

>>> u = User(email='test@example.com', password='password')
>>> t = Task(body='New Task', author=u)