【问题标题】:Python - SQLAlchemy QueryPython - SQLAlchemy 查询
【发布时间】:2022-01-01 14:53:15
【问题描述】:

添加信息]

本系统用于存储学生自愿参加的信息。 我有以下三个模块:

  1. student2122:学生信息存储学生姓名、学号、
  2. 自愿2122:存储活动名称、时间、地点的自愿活动...
  3. volunteer2121:记录学生的参与信息,如参与者id、活动id……

现在我需要显示特定学生参与的所有活动。

class volunteer2122(db.Model):
    __tablename__ = "tab_volunteer_2122"

    id = db.Column(db.Integer, primary_key=True)
    events_id = db.Column(db.Integer, db.ForeignKey("tab_voluntary_2122.id"))
    student_id = db.Column(db.Integer, db.ForeignKey("tab_student_2122.id"))
    actual_hr = db.Column(db.Float(255), default=0)
    student = db.relationship("student2122", back_populates="events")
    event = db.relationship("voluntary2122", back_populates="students")

class voluntary2122(db.Model):
    # voluntary
    __tablename__ = "tab_voluntary_2122"

    id = db.Column(db.Integer, primary_key=True)
    v_activity = db.Column(db.String(255),  nullable=False)
    v_date = db.Column(db.Date(), nullable=False, default=None)
    v_time = db.Column(db.String(225), nullable=True)
    v_duration = db.Column(db.Float(255))
    # v_category = db.Column(
    #     db.Enum(CategoryEnum),
    # )
    v_category = db.Column(db.String(255), nullable=False)
    v_venue = db.Column(db.String(255))
    v_ppl = db.Column(db.String(255))
    v_remark = db.Column(db.String(500))
    students = db.relationship("volunteer2122", back_populates="event")

class student2122(db.Model):
    # student
    __tablename__ = "tab_student_2122"

    id = db.Column(db.Integer, primary_key=True)
    cname = db.Column(db.String(255))
    ename = db.Column(db.String(255))
    student_no = db.Column(db.String(255))
    cic_no = db.Column(db.String(255))
    add_date = db.Column(db.String(255))
    class_code = db.Column(db.String(255))
    programme = db.Column(db.String(255))
    campus = db.Column(db.String(255))
    academic_year = db.Column(db.String(255))
    v_hr = db.Column(db.Float(255), default=0)
    v_hr_per = db.Column(db.Float(255), default=0)
    v_cata_hr = db.Column(db.Float(255), default=0)
    v_cata_hr_per = db.Column(db.Float(255), default=0)
    v_catb_hr = db.Column(db.Float(255), default=0)
    v_catb_hr_per = db.Column(db.Float(255), default=0)
    s_hr = db.Column(db.Float(255), default=0)
    s_hr_per = db.Column(db.Float(255), default=0)
    s_cata_hr = db.Column(db.Float(255), default=0)
    s_cata_hr_per = db.Column(db.Float(255), default=0)
    s_catb_hr = db.Column(db.Float(255), default=0)
    s_catb_hr_per = db.Column(db.Float(255), default=0)
    events = db.relationship("volunteer2122", back_populates="student")

我想使用以下 html 代码显示一位特定学生参与的所有活动:

            <tbody class="my-2">
            {% for s in events %}
            <tr>
                <td>{{ s.v_activity }}</td>
                <td>{{ s.v_date }}</td>
                <td>{{ s.v_time }}</td>
                <td>{{ s.v_duration }}</td>


            </tr>
            {% endfor %}
            </tbody>

但是,我未能使用以下路线脚本列出活动及其详细信息:

@app.route("/v_student_detail/<id>")
def v_student_detail(id):
    student = student2122.query.filter_by(id=id).first()
    done_activities = volunteer2122.query.filter_by(student_id=student.id).all()
    events = voluntary2122.query.filter_by(id=done_activities.events_id).all()
    return render_template('/sv_record/voluntary_record/v_student_detail.html', student=student, events=events)

以下错误消息。一旦我运行程序就会出现。而且我认为我未能将活动信息检索到“事件”:

错误: 'list' 对象没有属性 'events_id'

有人会帮忙提供解决方案吗?我已经花了很多时间,但我无法弄清楚。提前致谢。

【问题讨论】:

    标签: python sql foreign-keys flask-sqlalchemy


    【解决方案1】:

    done_activities = volunteer2122.query.filter_by(student_id=student.id).all() 返回一个包含所有查询命中的列表,即使是 0 个命中也返回一个空列表。这就是你的下一行失败的原因

    我想你想加入。 sqlalchemy 有时比普通的 sql 更烦人,试试这样:

    def v_student_detail(id):
        student = student2122.query.filter(student2122.id == id).first()
        events = db.session.query(volunteer2122).join(voluntary2122).filter(volunteer2122.student_id == student.id).all()
        return render_template('/sv_record/voluntary_record/v_student_detail.html', student=student, events=events)
    

    【讨论】:

    • mnzbono,感谢您的帮助。不再有错误消息,但它未能获得“事件”的自愿详细信息。自愿的详细信息存储在“自愿2122”模块中。无论如何,非常感谢。
    • 对不起,我想我不明白这些模型。现在检查一下,student.events 不是已经给你事件了吗?如果还没有解决,我明天再试一次
    • 没有。我应该说对不起。我没有说清楚。现在已经添加了更多信息。谢谢。
    【解决方案2】:

    用如下所示的代码弄明白了:

            events = db.session.query(voluntary2122).join(volunteer2122, voluntary2122.id==volunteer2122.events_id).filter(volunteer2122.student_id==student.id)
    

    但我还有一个问题,看看是否有任何帮助..非常感谢。

    Link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多