我正在创建一个记录系统,学生可以在其中注册类(class)。
# 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")
我想显示所有尚未注册类(class)的学生,因此我在程序和模板中使用了以下代码,但它只是在页面上显示所有学生。
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
最佳答案
我认为您的代码甚至会输出每个学生姓名的次数与当前类(class)中的学生人数一样多(如果学生已注册类(class),则输出次数减一):)
您当前的逻辑是
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
关于python - Pyramid/SQLAlchemy 显示对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22900596/