У меня есть две модели, в которых обе эти модели возвращаются 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]
@ IljaEverilä, еще раз спасибо. Я обновил вопрос
Что ж, я нашел проблему. Это из-за внешнего соединения, его следует изменить на соединение. Так просто.
Проблема уже устранена! :)
Пожалуйста, включите трассировку. Фрагмент сообщения об ошибке менее полезен. В
tre = session.query(Tableone, Tabletwo)
я бы предположил, чтоtreArr.append(tr.toDict())
должен вызвать ошибку атрибута, потому чтоtr
- это объект, подобный именованному кортежу, содержащий 2 объекта.