如何在api.model工厂中访问SQL Select结果

时间:2020-04-08 06:00:21

标签: flask flask-sqlalchemy flask-restful

当前正在寻找一种使用SQLAlchemy和Flask-restx呈现多对多关系的解决方案。

下面我将联接两个表Class和Country,其中Class有许多国家。

我想访问数据库中的其他“国家/地区”字段,在此示例中为country.name和country.iso2。我通过使用fields.list并将关联关系的属性设置为iso2在api.model中进行了部分管理。但是,这使我可以拥有country.name或country.iso2,但不能同时拥有两者。

理想地,在此示例中,我还要获取country.iso2和country.name。

任何建议将不胜感激。

SQLAlchemy模型

class_country = Table(
    'class_country',
    Base.metadata,
    Column('class_id', Integer, ForeignKey('class.id')),
    Column('country_id', Integer, ForeignKey('country.id'))
)

class Country(Base):
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(255), index=True, nullable=False)
    iso2 = Column(String(2), nullable=False)
##

class Class(Base):
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(255), index=True, nullable=False)
##
    # Relationships
    country = relationship('Country', secondary=class_country, lazy='subquery')

Flask-Restx(Flask-Restful)API

model = api.model('Class',{
##
    'country': fields.List(
        fields.String()
    ),
##
})

Result:
##
"country": [
    "Australia",
    "New Zealand"
]
##

model = api.model('Class',{
##
    'country': fields.List(
        fields.String(attribute='iso2')
    ),
##
})

Result:
##
"country": [
    "AU",
    "NZ"
],
##

查询

Class.query.filter_by(name=name).first()

1 个答案:

答案 0 :(得分:0)

您应该为List<SomeEnum> enumList = someStringList.stream() .map(SomeEnum::fromString) .collect(Collectors.toList()); 创建一个模型,并使用Country将其嵌套在Class中,例如

fields.Nested

检查Flask-RESTx documentation

中的确切用法