Схема сквоша-sqlalchemy-Marshmallow не работает - PullRequest
0 голосов
/ 09 ноября 2018

По сути, я хочу присоединиться к двум таблицам «пользователи» и «компания» и получить от пользователей информацию об их соответствующих компаниях.

это модель пользователя:

class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
firstname = db.Column(db.String(10), nullable=False)
lastname = db.Column(db.String(25), nullable=False)
username = db.Column(db.String(250), nullable=False)
email = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(250), nullable=False)
isPasswordReset = db.Column(db.Boolean, nullable=False)
companyId = db.Column(db.Integer, db.ForeignKey(
    'company.id'), nullable=True)

и это схема

class UserSchema(ma.Schema):
id = fields.Integer()
firstname = fields.String(required=True)
lastname = fields.String(required=True)
username = fields.String(required=True)
email = fields.String(required=True)
password = fields.String(required=True)
isPasswordReset = fields.Boolean(required=True)
companyId = fields.Integer()
company_name = fields.Nested(CompanySchema)

Это модель компании:

class Company(db.Model):
__tablename__ = 'company'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
companyName = db.Column(db.String(100), nullable=True)
companyCode = db.Column(db.String(20), nullable=True)
companyTheme = db.Column(db.String(300), nullable=True)

это схема компании:

class CompanySchema(ma.Schema):
id = fields.Integer()
companyName = fields.String(required=True)
companyCode = fields.String(required=True)
companyTheme = fields.String(required=True)

и это resource-user.py:

users_schema = UserSchema(many=True)
user_schema = UserSchema()

class UsersResource(Resource):
def get(self):
users = db.session.query(User.firstname, Company.companyName).join(
Company, User.companyId == Company.id).all()
if users:
results = users_schema.dump(users).data
return {'status': 'success', 'message': json.dumps(results, default=str)}, 200

и это вывод, который я получаю:

{ «статус»: «успех», "message": "[{\" firstname \ ": \" abc \ "}, {\" firstname \ ": \" xyz \ "}]" } * * Тысяча двадцать-один

показаны только пользовательские таблицы, а не из таблицы компании. Я много часов изучал учебники и прочее. но все еще не мог это исправить. Я новичок в колбе и sqlalchemy. пожалуйста кто-нибудь знает как это исправить?

1 Ответ

0 голосов
/ 09 ноября 2018

Сначала вам нужно объявить объект отношений в вашей модели sqlalchemy:

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    firstname = db.Column(db.String(10), nullable=False)
    lastname = db.Column(db.String(25), nullable=False)
    username = db.Column(db.String(250), nullable=False)
    email = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(250), nullable=False)
    isPasswordReset = db.Column(db.Boolean, nullable=False)
    companyId = db.Column(db.Integer, db.ForeignKey(
                         'company.id'), nullable=True)
    company = db.relationship("Company", backref="parents")  # <--

Затем в пользовательской схеме объявляют поле, представляющее этот объект:

class UserSchema(ma.Schema):
    id = fields.Integer()
    firstname = fields.String(required=True)
    lastname = fields.String(required=True)
    username = fields.String(required=True)
    email = fields.String(required=True)
    password = fields.String(required=True)
    isPasswordReset = fields.Boolean(required=True)
    companyId = fields.Integer()
    company = fields.Nested(CompanySchema) # <-- 

Обратите внимание, что имена полей должны быть одинаковыми (или вы можете использовать attribute аргумент).

При запросе вы можете просто сделать:

user_schema = UserSchema()
users = User.query.all()
results = users_schema.dump(users).data
return {'status': 'success', 'message': json.dumps(results, default=str)}, 200

(или return users_schema.dump(users) для тестирования)

В конце концов вы должны получить такой вывод:

{
id: 'something',
firstname: 'something',
lastname: 'something',
username: 'something',
email: 'something',
password: 'something',
isPasswordReset: 'something',
company : {
           id: 'something',
           companyName: 'something',
           companyCode: 'something',
           companyTheme: 'something',
          }
}

Это покрывает ваши потребности?

...