Flask-SQLAlchemy: как вернуть список отдельных объектов после выполнения операции соединения? - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть две таблицы Users и Organization.

У меня есть следующие сопоставленные классы SQL:

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column('id', db.Integer, primary_key=True)
    first_name = db.Column('first_name', db.String)
    second_name = db.Column('second_name', db.String)
    last_name = db.Column('last_name', db.String)
    # organization_id = db.Column('organization_id', db.Integer)
    organization_id = db.Column('organization_id',db.Integer,db.ForeignKey('organization.id'),nullable=False)
    # organization = db.relationship('Organization',backref='user',lazy=False)
    email = db.Column('email', db.String)
    mobile_no = db.Column('mobile_no', db.String)
    designation = db.Column('designation', db.String)
    role_id = db.Column('role_id', db.Integer)
    password = db.Column('password', db.String)

class Organization(db.Model):
    __tablename__ = 'organization'
    id = db.Column('id',db.Integer,primary_key=True)
    name = db.Column('name',db.String)
    type_id = db.Column('type_id',db.Integer)
    ward_id = db.Column('ward_id',db.Integer)
    attrs = ['id','name','type_id','ward_id']
    user_organization = db.relationship('User',backref='organization',lazy=False)

Я хочу выполнить операцию соединения для User.onrganization_id и Organization.id срезультаты выглядят так:

user.id |user.first_name имя.организации |user.email |user.mobile_no

Я попробовал этот код:

q = db.session.query(User,Organization).join(Organization).all()

Это даст мне результат в виде списка с коллекцией объектов:

[(<User 2>, <Organization 1>)]

Я хочу, чтобы тип возвращаемого значения былбыть списком одного объекта, а не коллекцией объектов.Как это

[(<UsersAndOrganization1>)] //Name of the object doesn't have to be the same

1 Ответ

0 голосов
/ 27 сентября 2018

Поскольку у вас есть lazy=False в ваших отношениях, SQLAlchemy выполнит соединение автоматически, когда вы выполните User.query.all().В результатах запроса у каждого пользователя будет заполнено свойство organization, поэтому вы сможете получить доступ к его полям, например, user.organization.name.

Независимо от параметра lazy в конфигурации отношений,Вы всегда можете добиться того же эффекта, явно указав параметры загрузки в запросе:

users = User.query.options(db.joinedload(Organization)).all()

Более подробную информацию можно найти в документации здесь (lazy=False является синонимом lazy='joined').

Кроме того, попробуйте включить SQLALCHEMY_ECHO в конфигурации приложения Flask и посмотреть фактические запросы SQL, генерируемые SQLAlchemy.Всегда очень полезно посмотреть, что происходит под капотом.

...