Используйте Flask-SqlAlchemy для запроса базы данных отношений - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь использовать Flask-SQLAlchemy для запроса базы данных для страницы профиля пользователя

Пока у меня нет решения этой проблемы, я могу только запросить все данные пользователя, используя users.query.all()

Каждый пользователь имеет свой собственный идентификатор role_id, Department_id, researchfield_id.

Как я могу запросить все данные о ролях, отделах, ResearchField, которые связаны с пользователем через идентификатор?

class User(UserMixin, db.Model):

    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key=True)
    password_hash = db.Column(db.String(128))
    is_admin = db.Column(db.Boolean, default=False)
    department_id = db.Column(db.Integer, db.ForeignKey('departments.id'))
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    research_id = db.Column(db.Integer, db.ForeignKey('researchfields.id'))

class Department(db.Model):
    __tablename__ = "departments"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(sqlalchemy.types.NVARCHAR(100), unique=True)
    user = db.relationship('User', backref='department',
                                lazy='dynamic')

class Role(db.Model):

    __tablename__ = 'roles'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(sqlalchemy.types.NVARCHAR(100), unique=True)
    users = db.relationship('User', backref='role',
                                lazy='dynamic')


class ResearchField(db.Model):

    __tablename__ = "researchfields"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(60), index=True)
    parent_id = db.Column(db.Integer, db.ForeignKey("researchfields.id") , nullable=True)
    users = db.relationship('User', backref='researchfield', lazy='dynamic')

1 Ответ

1 голос
/ 29 мая 2019

Если я правильно понимаю, то, что вы ищете, это способ отфильтровать пользователей на основе конкретной модели.Потому что в вашем примере обратный путь избыточен - у каждого пользователя есть только один отдел, поэтому нет необходимости отфильтровывать отделы для этого пользователя.Чтобы добиться этого, я бы использовал метод backref, предоставляемый SQLAlchemy из модели User.

Вот пример, состоящий из двух моделей:

from sqlalchemy.orm import backref

class User(UserMixin, db.Model):

    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key=True)
    password_hash = db.Column(db.String(128))
    is_admin = db.Column(db.Boolean, default=False)
    department_id = db.Column(db.Integer, db.ForeignKey('departments.id'))
    department = db.relationship("Department", backref=backref("users", lazy="dynamic"))

class Department(db.Model):
    __tablename__ = "departments"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(sqlalchemy.types.NVARCHAR(100), unique=True)

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

department = Department.query.filter_by(id=1).first()
print(department.users.filter_by(is_admin=True).all()) # get all admins with that department

У каждого пользователя есть только один отдел, поэтому вы можете просто получить отдел по адресу:

user = User.query.filter_by(id=1).first()
print(user.department) # prints Department object
...