0

I have a table type and language. I have a 1 to many relationship called languages from Type to Language. Marshmallow keeps showing there is no data inside a Type entry despite the data showing up in the console. Does anyone have any idea why?

schemas.py

class LanguageSchema(ma.SQLAlchemySchema):
    class Meta:
        model = Language
        ordered = True

    language = ma.auto_field()
    

class TypeSchema(ma.SQLAlchemySchema):
    class Meta:
        model = Type
        ordered = True

    id = ma.auto_field(dump_only=True)
    name = ma.auto_field(required=True, validate=validate.Length(min=3, max=64))
    settings = ma.Nested(TypeSettingsSchema, dump_only=True)
    languages = ma.Nested(LanguageSchema, many=False)

models.py

class Language(Updateable, db.Model):
    __tablename__ = 'language'

    id = sqla.Column(sqla.Integer, primary_key=True)
    language = sqla.Column(sqla.String(2), nullable=False)

    type_id = sqla.Column(sqla.Integer, sqla.ForeignKey(Type.id), index=True)
    type = sqla_orm.relationship('Type', back_populates='languages')

class Type(Updateable, db.Model):
    __tablename__ = 'type'

    languages = sqla_orm.relationship('Language', back_populates='type')

Output from query

{
  "data": [
    {
      "id": 1,
      "languages": {},
      "name": "Grocery",
      "settings": {
        "isHome": true,
        "layoutType": "classic",
        "productCard": "neon"
      }
    }]
}

console output showing what the query for id1 brings up and you can clearly see languages has data.

>>> t1.id
1
>>> t1.languages[0].language
'en'
>>> t1.name
'Grocery'
rockets4all
  • 684
  • 3
  • 8
  • 32

1 Answers1

1

You have a one to many relationship from type to language. So set the many parameter for the nested languages attribute within the TypeSchema to True and it should work.

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

app = Flask(__name__)
db = SQLAlchemy(app)
ma = Marshmallow(app)

class Language(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    code = db.Column(db.String(2), nullable=False)

    type_id = db.Column(db.Integer, db.ForeignKey('type.id'))
    type = db.relationship('Type', backref='languages')

class Type(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)

class LanguageSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Language

class TypeSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Type
    languages = ma.Nested(LanguageSchema, only=('code',), many=True)

with app.app_context():
    db.drop_all()
    db.create_all()

    l = Language(code='en')
    t = Type(
        name='Grocery',
        languages=[l]
    )

    db.session.add(t)
    db.session.commit()

@app.route('/')
def index():
    types = Type.query.all()
    types_schema = TypeSchema(many=True)
    types_data = types_schema.dump(types)
    return jsonify(data=types_data)
{
  "data": [
    {
      "id": 1,
      "languages": [
        {
          "code": "en"
        }
      ],
      "name": "Grocery"
    }
  ]
}
Detlef
  • 6,137
  • 2
  • 6
  • 24