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

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

Tableone Модель

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

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

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


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

Пожалуйста, включите трассировку. Фрагмент сообщения об ошибке менее полезен. В tre = session.query(Tableone, Tabletwo) я бы предположил, что treArr.append(tr.toDict()) должен вызвать ошибку атрибута, потому что tr - это объект, подобный именованному кортежу, содержащий 2 объекта.

Ilja Everilä 18.12.2018 07:16

@ IljaEverilä, еще раз спасибо. Я обновил вопрос

Al Kasih 18.12.2018 07:19

Что ж, я нашел проблему. Это из-за внешнего соединения, его следует изменить на соединение. Так просто.

Al Kasih 18.12.2018 08:36

Проблема уже устранена! :)

Al Kasih 18.12.2018 08:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
86
0

Другие вопросы по теме