Как решить ошибку возврата dict, когда она используется в таблице соединений? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть две модели, в которых обе модели возвращаются toDict:

Tableone Model

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 Model

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'],[...],[...],[...],]

Но мне нужно получить все данные из таблицы соединений, не упоминая, что выбрать один за другим, а также получить ключ для доступа к ним в ответ.

Пожалуйста, помогите мне, как сделать это правильно.Я очень новый в питоне.Спасибо заранее.


[ОБНОВЛЕНИЕ 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


[ОБНОВЛЕНИЕ 2]

Я собирался попробовать это с функцией слияния:

ссылка слияние-два словаря

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

Но ошибка упоминается в [ОБНОВЛЕНИЕ 1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...