我的目标
我想在将数据插入我的表时记录多次的顺序(例如 Clump-see 下面的表)。 orderinglist 模块真的很棒,但是我如何将它应用到我的多对多之间的中间表(名为 clump_syntaxs)?以前有人做过这个并且有一个很好的例子吗?

问题重述
我如何将插入时的排序应用到我的多对多。我尝试使用中间 table-clump_syntaxs 表的所有内容都崩溃了(对不起,奇怪的名字!)。

以下代码(为简洁起见已减少)有效!除了它只允许语法具有唯一的位置(而不是每个 Clump 实例的位置),我猜我需要将位置变量放在 clump_syntaxs 表上。所有表都是 sqlite

我的中间表

from sqlalchemy.ext.orderinglist import ordering_list
clump_syntaxs = db.Table('clump_syntaxs',
    db.Column('syntax_id', db.Integer, db.ForeignKey('syntax.id')),
    db.Column('clump_id', db.Integer, db.ForeignKey('clump.id')),
)

添加一个块和顺序语法表
class Clump(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    syntaxs = db.relationship('Syntax', secondary=clump_syntaxs,
        backref=db.backref('clumps', lazy='dynamic'),order_by="Syntax.position",
                            collection_class=ordering_list('position'))

class Syntax(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    jobs = db.relationship('Jobs',lazy='dynamic', backref='jobhistory')
    position = db.Column(db.Integer)
    #Jobs table not included

最佳答案

是的,您应该将 position 字段移动到中间表 ClumpSyntax ,并利用 association_proxy() 表中的 Clump

import sqlalchemy.ext.associationproxy import association_proxy

class Syntax(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    jobs = db.relationship('Jobs',lazy='dynamic', backref='jobhistory')
    #position = db.Column(db.Integer)  # moved to ClumpSyntax
    #Jobs table not included

class ClumpSyntax(db.Model):
    syntax_id = db.Column('syntax_id', db.Integer, db.ForeignKey('syntax.id'))
    syntax = relationship(Syntax)
    clump_id = db.Column('clump_id', db.Integer, db.ForeignKey('clump.id'))
    position = db.Column(db.Integer)

    # this constructor is very necessary !
    def __init__(self, syntax =None):
        self.syntax = syntax

class Clump(db.Model):
    id = db.Column(db.Integer, primary_key=True)

    _syntaxs = db.relationship('ClumpSyntax',
                               order_by=[ClumpSyntax.position],
                               collection_class=ordering_list('position'))
    syntaxs = association_proxy('_syntaxs','syntax')

根据 thisthis 文章,我的类似请求通过这种方式得到了很好的满足。您可以通过如下代码进行测试:
    session= some_code_to_get_db_session()
    syn1= Syntax()
    syn2= Syntax()
    syn3= Syntax()
    session.add(syn1)
    session.add(syn2)
    session.add(syn3)

    clump= Clump()
    session.add(clump)

    clump.syntaxs.append(syn1)
    clump.syntaxs.append(syn2)
    clump.syntaxs.append(syn3)

    session.commit()

    session.query(ClumpSyntax).count()  # print out 3
    session.query(Syntax).count()       # print out 3

关于flask - 设置多对多 sqlalchemy flask app sqlite db 的插入顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24480581/

10-12 22:13