2014-04-06 120 views
1

我創建了一個記錄系統,學生可以在其中註冊一個課程。顯示對象的金字塔/ SQLAlchemy

# 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 

回答

2

我覺得你的代碼,因爲有同學在當前類(減一,如果學生在就讀類):)

您當前的邏輯是

很多次,甚至輸出每個學生的名字
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 ==愛麗絲,跳過。第二:愛麗絲!=鮑勃,打印。第三:愛麗絲!=克勞德,打印等)

此外你的關係設置不是很「習慣sqlalchemy」。看看http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#many-to-many如果您設置模型作爲例子(EQ使用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 
+0

非常感謝,我認爲問題(正如您所提到的)與關係設置有關。謝謝! – amarz121

+0

回答這樣一個混亂的榮譽 –

+0

@ amarz121:實際上,問題在於檢查「如果學生沒有在課程中註冊」的一般算法,即使使用純Python列表,它也會錯誤地工作。巧合的是,關係配置的改變修復了這一點。 – Sergey

0

您所查詢的是所有錯誤的..

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 
+0

我不認爲你可以通過'classlist'屬性進行過濾 - 它是一種在Python端定義的關係,數據庫中沒有這樣的字段。 – Sergey

+0

@crooksey - 這不是我打算做的。我想展示那些還沒有參加特定班級的學生,而不是沒有參加任何班級的學生,但是感謝您的幫助。 – amarz121