Python 金字塔/SQLAlchemy显示对象

Python 金字塔/SQLAlchemy显示对象,python,object,sqlalchemy,pyramid,object-oriented-database,Python,Object,Sqlalchemy,Pyramid,Object Oriented Database,我正在创建一个记录系统,学生可以在其中注册到一个班级 # 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 = rela

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

# 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
currentClass=session.query(Class).filter\u by(id=Class\u id).first()
学生=session.query(学生).all()
#模板
%对于st-in学生:
%对于currentClass.Registered\U学生中的assoc:
%如果圣德!=助理学生证:
${st.id}-${st.forename}${st.lasname}
%恩迪夫 %结束 %结束
我认为您的代码甚至输出每个学生的名字,其次数与当前班级的学生人数相同(如果该学生已注册该班级,则减去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,skip。第二次:Alice!=Bob,print。第三次:Alice!=Claude,print,等等)

另外,你们的关系设置也不是“惯用的sqlalchemy”。看看如果您按照示例中的方式设置模型(例如,使用
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
%对于st-in学生:
%如果st不在课堂上,注册的学生:
${st.id}-${st.forename}${st.lasname}
%恩迪夫 %结束
您的查询完全错误

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
Student=Session.query(学生)\
筛选器(Student.classlist==None).all()
学生服务处学生:
${st.id}-${st.forename}${st.lasname}
外循环
非常感谢,我认为问题(如您所述)在于关系设置。非常感谢。回答这样的问题真是太好了mess@amarz121:事实上,问题在于检查“如果学生未注册上课”的通用算法,即使使用简单的Python列表,它也无法正常工作。巧合的是,关系配置的更改修复了这一问题。@Sergey:我以前尝试过你建议的算法,但出现了错误,我认为模型没有问题,但是在修改了模型之后,它工作了。我认为你不能通过
classlist
属性进行过滤-这是在Python端定义的关系,数据库中没有这样的字段。@croksey-我也不打算这么做。我想展示的是那些还没有在特定班级注册的学生,而不是那些根本没有在任何班级注册的学生,但是谢谢你的帮助。