我第一次使用Flask和SQLAlchemy构建REST API。 我试图在不实际命名表的情况下获取对象和所有相关对象的JSON表示(架构会定期演变)。
我们有一条带有“人”外键的记录。最重要的是,与灯具之间存在多对多关系:
class Record(Base, Model):
__tablename__ = 'record'
id = Column(BigInteger, primary_key=True)
id_creator = Column(ForeignKey(u'person.id', ondelete=u'SET NULL', onupdate=u'CASCADE', match=u'FULL'), nullable=False)
person = relationship(u'Person', primaryjoin='Record.id_creator == Person.id')
class Person(Base, Model):
__tablename__ = 'person'
id = Column(BigInteger, primary_key=True)
description = Column(String)
t_many_fixture_has_many_record = Table(
'many_fixture_has_many_record', metadata,
Column('id_fixture', ForeignKey(u'fixture.id', ondelete=u'RESTRICT', onupdate=u'CASCADE', match=u'FULL'), primary_key=True, nullable=False),
Column('id_record', ForeignKey(u'record.id', ondelete=u'RESTRICT', onupdate=u'CASCADE', match=u'FULL'), primary_key=True, nullable=False)
)
class Fixture(Base):
__tablename__ = 'fixture'
id = Column(BigInteger, primary_key=True)
record = relationship(u'Record', secondary=u'many_fixture_has_many_record')
如何生成如下所示的输出(我很灵活):
{
"id": 1,
"person": {
"id": 12,
"description": "a description"
},
"fixture": [
{
"id": 1
},
{
"id": 2
}
]
}
到目前为止,我设法获得了用外键list_of_dependant_objects = dependent_objects(my_record)
引用的对象的列表,但我不知道如何处理其余的对象。
欢迎任何帮助。 谢谢!
答案 0 :(得分:0)
SQLAlchemy后面有SQL,SQLAlchemy不会尝试向您隐藏它。这样,您必须指定要从中加载的表的列表。 SQL中没有“相关”表或“相关”表之类的术语。
如果您不想指定整个表结构,则可以在SQLAlchemy文档中将表的autoload
属性用作表described:
messages = Table('messages', meta, autoload=True, autoload_with=engine)
顺便说一句,您可以使用非常高级的SQL来找出这一点。在大多数情况下,这是不值得的,因为此SQL是特定于数据库的,并且可能从同一数据库的一个版本更改为另一个版本。另外,您可以阅读整个数据库架构并尝试创建图,但是架构和数据库之间可能存在您可能不知道的链接。