【问题标题】:How to properly use association_proxy and ordering_list together with SQLAlchemy如何正确使用 Association_proxy 和 ordering_list 以及 SQLAlchemy
【发布时间】:2014-01-22 19:58:56
【问题描述】:

基于 SQLAlchemy Google Group 上的一些帖子:

https://groups.google.com/forum/#!topic/sqlalchemy/S4_8PeRBNJw https://groups.google.com/forum/#!topic/sqlalchemy/YRyI7ic1QkY

我假设我可以成功使用 assocation_proxyordering_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 sqlalchemy flask


    【解决方案1】:

    太接近了 ;-)

    请阅读Creation of New Values 扩展名的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),
        )
    

    我个人更喜欢后者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-02
      • 2016-06-02
      • 2016-12-25
      • 1970-01-01
      • 2015-02-24
      • 2019-01-16
      • 2020-03-17
      • 1970-01-01
      相关资源
      最近更新 更多