加载所有相关对象而无需命名表

时间:2018-10-12 20:58:45

标签: python sqlalchemy flask-sqlalchemy

我第一次使用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)引用的对象的列表,但我不知道如何处理其余的对象。

欢迎任何帮助。 谢谢!

1 个答案:

答案 0 :(得分:0)

SQLAlchemy后面有SQL,SQLAlchemy不会尝试向您隐藏它。这样,您必须指定要从中加载的表的列表。 SQL中没有“相关”表或“相关”表之类的术语。

如果您不想指定整个表结构,则可以在SQLAlchemy文档中将表的autoload属性用作表described

messages = Table('messages', meta, autoload=True, autoload_with=engine)

顺便说一句,您可以使用非常高级的SQL来找出这一点。在大多数情况下,这是不值得的,因为此SQL是特定于数据库的,并且可能从同一数据库的一个版本更改为另一个版本。另外,您可以阅读整个数据库架构并尝试创建图,但是架构和数据库之间可能存在您可能不知道的链接。