【问题标题】:Pyramid/SQLAlchemy displaying objectsPyramid/SQLAlchemy 显示对象
【发布时间】:2014-04-06 22:04:36
【问题描述】:

我正在创建一个记录系统,学生可以在其中注册一个班级。

# MODEL
class Association(Base):
__tablename__ = 'association'
class_id = Column(Integer, ForeignKey('classes.id'), primary_key=True)
student_id = Column(Integer, ForeignKey('students.id'), primary_key=True)
theClass = relationship("Class")

class Student(Base):
__tablename__ = 'students'
id = Column(Integer, primary_key=True)
name = Column(String(30))
classlist = relationship("Association", backref='student')

class Class(Base):
__tablename__ = 'classes'
id = Column(Integer, primary_key=True)
name = Column(String(20), nullable=False)
teacher_id = Column(Integer, ForeignKey('teachers.id'))
enrolled_students = relationship("Association")

我想显示所有尚未注册课程的学生,所以我在我的程序和模板中使用了以下代码,但它只显示页面上的所有学生。

currentClass = session.query(Class).filter_by(id=class_id).first()
students = session.query(Student).all()

# TEMPLATE
% for st in students:
% for assoc in currentClass.enrolled_students:
% if st.id != assoc.student_id:
    <input type="checkbox" name="student_id" value="${ st.id }" >${ st.id } - ${ st.forename } ${ st.surname }</input><br/> 
% endif
% endfor
% endfor

【问题讨论】:

    标签: python object sqlalchemy pyramid object-oriented-database


    【解决方案1】:

    我认为您的代码甚至输出每个学生姓名的次数与当前班级中的学生人数一样多(如果学生已注册班级,则减一):)

    你现在的逻辑是

    for student in all_student:  # Alice, Bob, Claude
        for enrolled_student in current_class.enrolled_students: # Alice, Bob
            if student != enrolled_student:
                print student
    

    上面的输出是

    Alice, Alice, Bob, Bob, Claude, Claude, Claude  
    

    (第一次迭代:Alice == Alice,跳过。第二次:Alice != Bob,打印。第三次:Alice != Claude,打印等)

    您的关系设置也不是“惯用的 sqlalchemy”。看看http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#many-to-many 如果您按照示例设置模型(例如使用relationship() 函数的secondary 参数),您将能够执行类似的操作

    % for st in students:
    % if st not in class.enrolled_students:
        <input type="checkbox" name="student_id" value="${ st.id }" >${ st.id } - ${ st.forename } ${ st.surname }</input><br/> 
    % endif
    % endfor
    

    【讨论】:

    • 非常感谢,我认为问题(正如您提到的)与关系设置有关。谢谢!
    • 感谢回答如此混乱的问题
    • @amarz121:实际上,问题在于检查“如果学生没有在课堂上注册”的通用算法,即使使用普通的 Python 列表,它也会无法正常工作。巧合的是,关系配置的变化解决了这个问题。
    • @Sergey:我之前尝试过你建议的算法,但是出现了错误,我认为模型没有问题,但是修改模型后它起作用了。
    【解决方案2】:

    你的查询全错了..

    students = Session.query(Student).\
                filter(Student.classlist == None).all()
    
    for student ins students:
         <input type="checkbox" name="student_id" value="${ st.id }" >${ st.id } - ${ st.forename } ${ st.surname }</input><br/>
    endfor
    

    【讨论】:

    • 我认为您不能通过classlist 属性进行过滤 - 这是在 Python 端定义的关系,数据库中没有这样的字段。
    • @crooksey - 这也不是我打算做的。我想显示尚未注册特定班级的学生,而不是根本没有注册任何班级的学生,但感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2011-10-31
    • 2013-09-27
    • 2021-05-27
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多