mdm*_*jsh 4 python many-to-many sqlalchemy flask-sqlalchemy
我在 Flask-sqlalchemy 模型中定义了以下多对多关系:
\n\nclass Course: \n ...\n modules = db.relationship('Module', secondary=course_modules,\n primaryjoin=(course_modules.c.course_id == id), \n secondaryjoin=(course_modules.c.module_id == id),\n backref=db.backref('courses', lazy='dynamic'), lazy='dynamic') \nRun Code Online (Sandbox Code Playgroud)\n\nmodule_course 表对象定义为:
\n\ncourse_modules=db.Table('course_modules',\n db.Column('course_id', db.Integer, db.ForeignKey('course.id')),\n db.Column('module_id', db.Integer, db.ForeignKey('module.id'))\n)\nRun Code Online (Sandbox Code Playgroud)\n\n当执行以下操作在此表中创建记录时,我收到 sqlalchemy.orm.exc.UnmappedColumnError:
\n\nmodule = module_service.get_by_id(1) #\xc2\xa0returns a Module instance\ncourse.modules = [module] #\xc2\xa0course being a Course instance\ncourse.modules.all()\n\nsqlalchemy.orm.exc.UnmappedColumnError: Can't execute sync rule for \nsource column 'course.id'; mapper 'Mapper|Module|module' does not map \nthis column. Try using an explicit `foreign_keys` collection which \ndoes not include destination column 'course_modules.module_id' \n(or use a viewonly=True relation). \nRun Code Online (Sandbox Code Playgroud)\n\n当我删除PrimaryJoin和secondaryJoin时行并使用此方法时,我不会遇到相同的错误,并且数据确实会被插入。
\n\n为什么包含主连接条件和辅助连接条件会导致插入中断?是否有其他方法可以将数据插入到我应该使用的多对多关系中?
\n在此代码中:
modules = db.relationship('Module', secondary=course_modules,
primaryjoin=(course_modules.c.course_id == id),
secondaryjoin=(course_modules.c.module_id == id),
Run Code Online (Sandbox Code Playgroud)
id由于作用域为 Course.id,primaryjoin 和 secondaryjoin 中的 均指此。您应该明确引用正确的id列,例如:
modules = db.relationship('Module', secondary=course_modules,
primaryjoin=(course_modules.c.course_id == Course.id),
secondaryjoin=(course_modules.c.module_id == Module.id),
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2349 次 |
| 最近记录: |