【问题标题】:filter children in an one-to-many relationship in flask-sqlalchemy在flask-sqlalchemy中以一对多关系过滤孩子
【发布时间】:2021-08-14 01:22:55
【问题描述】:

我定义了4个数据库模型如下:

class User(ModelMixin, db.Model):
                            id = db.Column(db.Integer, primary_key=True)
                            
                            full_name = db.Column(db.String, nullable=False)
                            gender = db.Column(db.Integer, db.ForeignKey('gender.key'))
                            mobile = db.Column(db.String, unique=True, nullable=False)
                            # some other fields in between                        
                            ...
                            doctor = db.relationship(Doctor, backref='user', cascade="all,delete", uselist=False)
          
class Doctor(ModelMixin, db.Model):
                    id = db.Column(db.Integer, primary_key=True)
                    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
                    category_id = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False)
                    schedules = db.relationship(DoctorSchedule, backref='doctor', lazy=True, cascade='delete-orphan, delete, all')
                    reserved_intervals = db.relationship(AppointmentInterval, backref='doctor', lazy=True)
                    # some other fields in between          
                    ...

class DoctorSchedule(ModelMixin, db.Model):
                __tablename__ = 'doctor_schedule'
                __table_args__ = (
                    db.UniqueConstraint('day_of_week', 'type', 'doctor_id', name='unique_schedule'),
                )
                id = db.Column(db.Integer, primary_key=True)
                doctor_id = db.Column(db.Integer, db.ForeignKey('doctor.id', ondelete='CASCADE'), nullable=False)
                day_of_week = db.Column(db.Integer, nullable=False)
                type = db.Column(db.Integer, nullable=False)
                intervals = db.relationship(ScheduleInterval, backref='doctor_schedule', lazy=True, cascade='delete-orphan, delete, all')

class ScheduleInterval(ModelMixin, db.Model):
            __tablename__ = 'schedule_interval'
            id = db.Column(db.Integer, primary_key=True)
            schedule_id = db.Column(db.Integer, db.ForeignKey('doctor_schedule.id', ondelete="CASCADE"), nullable=False)
            start = db.Column(db.Time, nullable=False)
            end = db.Column(db.Time, nullable=False)

现在我想知道如何使用医生模型(父)编写查询来过滤调度模型(子)。以下查询正确吗?

doctor_schedule = Doctor.query.filter(
                Doctor.schedules.any(doctor_id=doctor_id),
                Doctor.schedules.any(type=appointment_type)).all()

【问题讨论】:

  • 上述查询是否有任何错误或任何限制?

标签: python-3.x postgresql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

编写相同的标准方法是使用“__”双下划线,如下所示:

doctor_schedule = Doctor.query.filter(
            schedules__doctor_id=doctor_id,
            schedules__type=appointment_type).all()

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 2012-02-08
    • 2016-06-15
    • 2021-08-31
    • 1970-01-01
    • 2016-08-23
    • 2012-11-11
    • 2014-05-19
    相关资源
    最近更新 更多