Python 如何与SQLAlchemy一起正确使用关联\代理和排序\列表
根据SQLAlchemy Google Group上的一些帖子: 我假设我可以成功地使用Python 如何与SQLAlchemy一起正确使用关联\代理和排序\列表,python,sqlalchemy,flask,Python,Sqlalchemy,Flask,根据SQLAlchemy Google Group上的一些帖子: 我假设我可以成功地使用association\u proxy和ordering\u list扩展在两个模型之间创建有序的多对多关系,例如在下面的Flask/SQLAlchemy代码中: from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy.ext.associationproxy import association_pr
association\u proxy
和ordering\u list
扩展在两个模型之间创建有序的多对多关系,例如在下面的Flask/SQLAlchemy代码中:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.orderinglist import ordering_list
app = Flask(__name__)
app.debug = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
db = SQLAlchemy(app)
class Image(db.Model):
__tablename__ = 'images'
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(255))
class UserImage(db.Model):
__tablename__ = 'user_images'
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
image_id = db.Column(db.Integer, db.ForeignKey('images.id'), primary_key=True)
image = db.relationship('Image')
position = db.Column(db.Integer)
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
_images = db.relationship('UserImage',
order_by='UserImage.position',
collection_class=ordering_list('position'))
images = association_proxy('_images', 'image')
with app.app_context():
db.create_all()
user = User(name='Matt')
user.images.append(Image(filename='avatar.png'))
db.session.add(user)
db.session.commit()
if __name__ == '__main__':
app.run()
但我最终得到了以下回溯:
$ python app.py
Traceback (most recent call last):
File "app.py", line 44, in <module>
user.images.append(Image(filename='avatar.png'))
File "/Users/matt/.virtualenvs/sqlalchemy-temp/lib/python2.7/site-packages/sqlalchemy/ext/associationproxy.py", line 595, in append
item = self._create(value)
File "/Users/matt/.virtualenvs/sqlalchemy-temp/lib/python2.7/site-packages/sqlalchemy/ext/associationproxy.py", line 522, in _create
return self.creator(value)
TypeError: __init__() takes exactly 1 argument (2 given)
$python app.py
回溯(最近一次呼叫最后一次):
文件“app.py”,第44行,在
user.images.append(Image(filename='avatar.png'))
文件“/Users/matt/.virtualenvs/sqlalchemy-temp/lib/python2.7/site-packages/sqlalchemy/ext/associationproxy.py”,第595行,在附录中
项目=自我创造(价值)
文件“/Users/matt/.virtualenvs/sqlalchemy temp/lib/python2.7/site packages/sqlalchemy/ext/associationproxy.py”,第522行,在创建
返回self.creator(值)
TypeError:\uuuu init\uuuuuu()正好接受1个参数(给定2个)
这是不可能的还是我做错了什么
请阅读association\u proxy
分机部分。为了使代码正常工作,您可以 选项1:将以下构造函数添加到
UserImage
类中:
def __init__(self, image):
self.image = image
或
选项2:用您的函数覆盖默认的创建者
:
images = association_proxy('_images', 'image',
creator=lambda _i: UserImage(image=_i),
)
我个人倾向于后者