Как получить доступ к SQL Выберите результаты с помощью фабрики api.model - PullRequest
0 голосов
/ 08 апреля 2020

В настоящее время ищем решение для рендеринга отношения многих ко многим, используя SQLAlchemy и Flask -restx.

Ниже я объединяю две таблицы Class и Country, где Class имеет много стран.

Я хочу получить доступ к другим полям Country в базе данных, в этом примере country.name и country.iso2. Я частично справился с этим в api.model, используя fields.list и установив атрибут отношения iso2. Тем не менее, это позволяет мне иметь страну.имя или страну.изо2, но не оба.

В идеале в этом примере я хочу получить также страну.изо2 название страны.

Любой совет будет приветствуем.

Модели 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 голосов
/ 09 апреля 2020

Вы должны создать модель для Country и вставить ее в Class, используя fields.Nested, например,

country = api.model('Country',{
  'id': fields.Integer,
  'name': fields.String,
  'iso2': fields.String,
})

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

Проверьте точное использование в документации Flask -RESTx

...