Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 筛选关系';通过辅助表的字段进行反向引用_Python_Sqlalchemy_Relationship - Fatal编程技术网

Python 筛选关系';通过辅助表的字段进行反向引用

Python 筛选关系';通过辅助表的字段进行反向引用,python,sqlalchemy,relationship,Python,Sqlalchemy,Relationship,我有一组相当复杂的sqlalchemy模型(都是通过flask sqlalchemy的db.Model类使用DeclarativeBase声明的)。业务逻辑如下: 每个任务都有一个或多个问题 每个问题都有一个或多个选项 用户可以提交,其中包含一个或多个问题的答案(来自一个或多个任务) 我准备了一个示例应用程序来演示核心功能: #/usr/bin/env python 来自未来导入打印功能 从烧瓶进口烧瓶 从flask.ext.sqlalchemy导入sqlalchemy 导入sqlalche

我有一组相当复杂的sqlalchemy模型(都是通过flask sqlalchemy的db.Model类使用DeclarativeBase声明的)。业务逻辑如下:

  • 每个任务都有一个或多个问题
  • 每个问题都有一个或多个选项
  • 用户可以提交,其中包含一个或多个问题的答案(来自一个或多个任务)
我准备了一个示例应用程序来演示核心功能:

#/usr/bin/env python
来自未来导入打印功能
从烧瓶进口烧瓶
从flask.ext.sqlalchemy导入sqlalchemy
导入sqlalchemy\u默认值
从flask.ext.script导入管理器,服务器
app=烧瓶(名称)
app.config.update(
DEBUG=True,
SQLALCHEMY\u数据库\u URI=(
“postgresql://sqlareltest:sqlareltest' +
“@localhost:5432/sqlareltest”),
)
db=SQLAlchemy(应用程序)
db.Column=sqlalchemy\u defaults.Column
sqlalchemy\u默认值。使\u变懒\u配置(db.mapper)
类任务(db.Model):
id=db.Column(db.Integer(),主键=True)
title=db.Column(db.String(255),默认值=“”)
定义报告(自我):
返回自己的标题
课程提交(数据库模型):
id=db.Column(db.Integer(),主键=True)
title=db.Column(db.String(255),默认值=“”)
定义报告(自我):
返回自己的标题
类任务问题(db.Model):
id=db.Column(db.Integer(),主键=True)
task_id=db.Column(db.Integer,db.ForeignKey('task.id'))
title=db.Column(db.String(255),默认值=“”)
权重=db.Column(db.Integer(),默认值=0)
task=db.relationship(task,backref=db.backref(
“任务和问题”,
订单数量=重量,
(动态的)
定义报告(自我):
返回自己的标题
类选项(db.Model):
id=db.Column(db.Integer(),主键=True)
任务\问题\ id=db.Column(db.Integer,
db.ForeignKey('task_question.id'))
title=db.Column(db.String(255),默认值=“”)
权重=db.Column(db.Integer(),默认值=0)
task_question=db.relationship(TaskQuestion,backref=db.backref(
“问题与选项”,
订单数量=重量,
(动态的)
定义报告(自我):
返回自己的标题
类任务提交(db.Model):
id=db.Column(db.Integer(),主键=True)
task_id=db.Column(db.Integer,db.ForeignKey('task.id'))
提交id=db.Column(db.Integer,
db.ForeignKey('submission.id'))
task=db.relationship(task,backref=db.backref(
“任务提交”,
(动态的)
提交=db.relationship(提交,backref=db.backref(
“任务提交”,
(动态的)
定义报告(自我):
返回“%s:%s%”(self.task,self.submission)
类任务问题提交(数据库模型):
id=db.Column(db.Integer(),主键=True)
任务提交id=db.Column(db.Integer,
db.ForeignKey('task_submission.id'))
任务\问题\ id=db.Column(db.Integer,
db.ForeignKey('task_question.id'))
问题\u选项\u id=db.Column(db.Integer,
db.ForeignKey('question\u option.id'))
任务提交=db.relationship(
任务提交,
次要=任务问题。表,
二次连接=(
“TaskQuestionSubmission.task_question_id==TaskQuestion.id”),
初级连接=(
“任务问题提交。任务提交\u id==”+
“TaskSubmission.id”),
backref=db.backref(
“任务\问题\提交”,
order_by=TaskQuestion.weight,
(动态的)
task_question=db.relationship(TaskQuestion,backref=db.backref(
“任务\问题\提交”,
(动态的)
问题_选项=db.relationship(
问题选项,
backref=db.backref(
“任务\问题\提交”,
(动态的)
定义报告(自我):
返回“%s:%s:%s%”(self.task\u提交,
自我任务(self.task)问题,,
自我提问(可选)
经理=经理(应用程序)
@经理指挥部
def createdb():
db.create_all()
@经理指挥部
def createtask():
t=任务(title='告诉我们你自己的情况')
db.session.add(t)
tq=TaskQuestion(title='你最喜欢的颜色是什么?',权重=1)
t、 任务\问题。附加(tq)
db.session.add(tq)
qo=QuestionOption(标题为蓝色,重量为1)
问题选项附加(qo)
db.session.add(qo)
qo=QuestionOption(标题为红色,权重为0)
问题选项附加(qo)
db.session.add(qo)
qo=问题选项(标题为绿色,权重为2)
问题选项附加(qo)
db.session.add(qo)
tq=TaskQuestion(title='你最喜欢的水果是什么?',重量=0)
t、 任务\问题。附加(tq)
db.session.add(tq)
qo=QuestionOption(title='Apple',weight=2)
问题选项附加(qo)
db.session.add(qo)
qo=QuestionOption(title='Peach',weight=1)
问题选项附加(qo)
db.session.add(qo)
qo=QuestionOption(title='Grape',weight=0)
问题选项附加(qo)
db.session.add(qo)
db.session.commit()
@经理指挥部
def createsubmission():
t=Task.query.first()
s=提交(title='关于Johnny'的信息〕
db.session.add(s)
ts=任务提交(任务=t,提交=s)
db.session.add(ts)
tq=t.任务与问题[1]
qo=QuestionOption.query.filter\u by(task\u question=tq).first()
tqs=任务问题提交(任务提交=ts,
任务\问题=tq,
问题(选项=qo)
db.session.add(tqs)
tq=t.任务\问题[0]
qo=QuestionOption.query.filter\u by(task\u question=tq).first()
tqs=任务问题提交(任务提交=ts,
任务\问题=tq,
./app.py createdb
./app.py createtask
./app.py createsubmission
./app.py showoldsubmission
Tell us about yourself: Info about Johnny: What is your favourite colour?: Blue
Tell us about yourself: Info about Johnny: What is your favourite fruit?: Apple
./app.py shownewsubmission
Tell us about yourself: Info about Sarah: What is your favourite colour?: Red
Tell us about yourself: Info about Sarah: What is your favourite fruit?: Peach
./app.py showoldsubmission
[Tell us about yourself: Info about Johnny]: What is your favourite fruit?: Apple
[Tell us about yourself: Info about Johnny]: What is your favourite colour?: Blue
./app.py shownewsubmission
Traceback (most recent call last):
  File "./app.py", line 231, in <module>
    manager.run()
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/flask_script/__init__.py", line 412, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/flask_script/__init__.py", line 383, in handle
    res = handle(*args, **config)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/flask_script/commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "./app.py", line 217, in shownewsubmission
    question_option=qo)
  File "<string>", line 4, in __init__
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/state.py", line 260, in _initialize_instance
    return manager.original_init(*mixed[1:], **kwargs)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 526, in _declarative_constructor
    setattr(self, k, kwargs[k])
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 226, in __set__
    instance_dict(instance), value, None)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 1009, in set
    lambda adapter, i: adapter.adapt_like_to_iterable(i))
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 1025, in _set_iterable
    new_values = list(adapter(new_collection, iterable))
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 1009, in <lambda>
    lambda adapter, i: adapter.adapt_like_to_iterable(i))
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 646, in adapt_like_to_iterable
    given, wanted))
TypeError: <flask_script.commands.Command object at 0x7f4c52967190>: Incompatible collection type: TaskSubmission is not list-like
./app.py shownewsubmission
Traceback (most recent call last):
  File "./app.py", line 235, in <module>
    manager.run()
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/flask_script/__init__.py", line 412, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/flask_script/__init__.py", line 383, in handle
    res = handle(*args, **config)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/flask_script/commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "./app.py", line 223, in shownewsubmission
    tq = t.task_questions[0]
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.py", line 254, in __getitem__
    sess = self.session
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.py", line 237, in session
    sess.flush()
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1919, in flush
    self._flush(objects)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2037, in _flush
    transaction.rollback(_capture_exception=True)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2001, in _flush
    flush_context.execute()
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 372, in execute
    rec.execute(self)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 481, in execute
    self.dependency_processor.process_saves(uow, states)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/dependency.py", line 1051, in process_saves
    False, uowcommit, "add"):
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/dependency.py", line 1156, in _synchronize
    self.prop.synchronize_pairs)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/sync.py", line 84, in populate_dict
    _raise_col_to_prop(False, source_mapper, l, None, r)
  File "/wsgi/sqla-rel-test/env/local/lib/python2.7/site-packages/sqlalchemy/orm/sync.py", line 123, in _raise_col_to_prop
    (source_column, source_mapper, dest_column))
sqlalchemy.orm.exc.UnmappedColumnError: Can't execute sync rule for source column 'task_question.'; mapper 'Mapper|TaskSubmission|task_submission' does not map this column.  Try using an explicit `foreign_keys` collection which does not include destination column 'task_question_submission.' (or use a viewonly=True relation).