在联接表中使用时,如何解决字典返回错误?

时间:2018-12-18 04:44:18

标签: python flask sqlalchemy

我有两个模型,其中两个模型都通过toDict返回:

平板模型

class Base(db.Model):
    __abstract__  = True


class Tableone(Base):
    __tablename__ = 'tableone'

    zxc = db.Column(db.VARCHAR(20),  nullable=False)
    asd = db.Column(db.VARCHAR(20),  nullable=False)
    qwe = db.Column(db.Integer,  nullable=False)

    tabletwo = db.relationship("Tabletwo", primaryjoin="foreign(Tabletwo.asd) == Tableone.bnm", uselist=True)

    def __init__(zxc, asd, qwe):

        self.zxc     = zxc
        self.asd    = asd 
        self.qwe = qwe

    def toDict(self):
        return { c.key: getattr(self, c.key) for c in inspect(self).mapper.column_attrs }

Tabletwo模型

class Base(db.Model):
    __abstract__  = True


class Tabletwo(Base):
    __tablename__ = 'tabletwo'

    iop = db.Column(db.VARCHAR(20),  nullable=False)
    jkl = db.Column(db.VARCHAR(20),  nullable=False)
    bnm = db.Column(db.Integer,  nullable=False)

    def __init__(iop, jkl, bnm ):

        self.iop     = iop
        self.jkl    = jkl 
        self.bnm = bnm

    def toDict(self):
        return { c.key: getattr(self, c.key) for c in inspect(self).mapper.column_attrs }

两个模型都具有toDict函数。当我通过控制器访问它时:

    def index():
        tre = session.query(Tableone, Tabletwo).outerjoin(Tableone.tabletwo).all()
        treArr = []
        for tr in tre:
            treArr.append(tr.toDict())
        return jsonify(treArr)

它给我错误.... is not JSON serializable

如果我只使用它而不使用像这样的连接方法,它将很好用:

  tre = session.query(Tableone).all()

或者,如果我提到一个接一个的连接也有效:

  tre = session.query(Tableone.iop, Tableone.jkl, Tableone.bnm,  Tabletwo.zxc).outerjoin(Tableone.tabletwo).all()

即使结果只是多维数组。 [['iop1','jkl1', 'bnm1', 'zxc1'],[...],[...],[...],]

但是我需要获取联接表中的所有数据,而不必一一提及要选择的内容,还需要相应的键来访问它。

请帮助我正确操作。我是python的新手。提前谢谢了。


[UPDATE 1]

我只是知道是否可以这样访问它:

    for tr in tre:
        treArr.append(tr.Tabletwo.toDict()) # here
    return jsonify(treArr)

抛出错误,提示AttributeError: 'NoneType' object has no attribute 'toDict'

但是,如果我这样访问

    for tr in tre:
        treArr.append(tr.Tableone.toDict()) # here
    return jsonify(treArr)

仅给出TableOne的结果


[UPDATE 2]

我打算用合并功能尝试它:

参考merge-two-dictionaries

for tr in tre:
    merge_two_dicts(sim.Simses.toDict(), sim.Carrier.toDict()) 
...

def merge_two_dicts(x, y):
    z = x.copy()   # start with x's keys and values
    z.update(y)    # modifies z with y's keys and values & returns None
    return z

但是在 [UPDATE 1]

中提到了错误

0 个答案:

没有答案
相关问题