Flask sql alchemy получить дочерний объект - PullRequest
0 голосов
/ 01 октября 2019

Когда я объявляю связь с SQL-Alchemy, я не нашел все дочерние данные, когда Marshmallow сбрасывает объект. Когда Marshmallow десериализует объект, я хотел бы передать свой объект Member в json, а не только в Ids.

Мои модели:

class Company(db.Model):
    __table_args__ = {"schema": "public"}
    id_company = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    members = db.relationship('Member', back_populates="company", lazy='joined')

class Member(db.Model):
    __table_args__ = {"schema": "public"}
    id_member = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    age = db.Column(db.Integer)
    company_id = db.Column(db.Integer, db.ForeignKey('public.company.id_company'), nullable=False)
    company = db.relationship("Company", back_populates="members",lazy='joined')

class MemberSchema(ma.ModelSchema):
    class Meta:
        model = Member


class CompanySchema(ma.ModelSchema):
    class Meta:
        model = Company

class CompanyIdInputSchema(Schema):
    id_company = fields.Integer(required=True)

Мой маршрут:

company_schema = CompanySchema()
pagination_schema = PaginationInputSchema()
company_id_schema = CompanyIdInputSchema()

class CompanyById(Resource):
    @swag_from('swag_docs/swag_company_get.yml')
    def get(self, id_company):
        company_id_args = {"id_company": id_company}
        errors = company_id_schema.validate(company_id_args)
        if errors:
            return {"error": str(errors)}, 500
        else:
            company = Company.query.filter_by(id_company=id_company)
            company = companies_schema.dump(company)
            if len(company)>=1:
                return company, 201
            else:
                return 204

Результат при звонке по маршруту:

  {
    "members": [
      1
    ],
    "id_company": 1,
    "name": "Total"
  }

Что я ожидаю:

  {
    "members": [
      {'id_member':1,'name':'Laurent','age':32,'company_id'=1}
    ],
    "id_company": 1,
    "name": "Total"
  }

1 Ответ

1 голос
/ 01 октября 2019

Если вы хотите, чтобы сериализатор сериализовал вложенное поле как список сериализованных объектов вместо идентификаторов, вам нужно добавить поле Nested с many=True.

class CompanySchema(ma.ModelSchema):
    members = ma.fields.Nested(MemberSchema, many=True)
    class Meta:
        model = Company
...