如何与sqlalchemy一起正确使用coocsipt_proxy和ordering_list



基于SQLalchemy Google组上的一些帖子:

https://groups.google.com/forum/# !! topic/sqlalchemy/s4_8perbnjwhttps://groups.google.com/forum/# !! topic/sqlalchemy/yryi7ic1qky

我以为我可以成功使用 assocation_proxyordering_list扩展名来创建有序的,许多与以下瓶/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)

这是不可能的还是我在公然做错事?

sooo close; - )

请阅读association_proxy扩展的新价值分隔的创建。
为了使您的代码工作,您可以

option-1 :将以下构造函数添加到UserImage类:

def __init__(self, image):
    self.image = image

option-2 :用您的功能覆盖默认的creator

images = association_proxy('_images', 'image',
    creator=lambda _i: UserImage(image=_i),
    )

我个人偏爱后者。

最新更新