2013-11-22 45 views
1

我剛開始學習Python的NDB我想知道我怎麼能顯示參加所選課程(過濾出席)的學生則標誌着他們爲每個學生一個ardio按鈕考勤,考勤值添加到preveious一個最後結果保存回數據存儲區或打印到文件不能得到NDB查詢結果

# - - 編碼:cp1256 - -

import webapp2 
import os 
import cgi 
from google.appengine.ext import ndb 
from google.appengine.api import users 
from google.appengine.api import mail 
from google.appengine.ext.webapp import template 


class Student(ndb.Model): 
    id = ndb.IntegerProperty() 
    name = ndb.StringProperty() 
    email = ndb.StringProperty() 
    #courses= ndb.StructuredProperty(Courses, repeated=True) and attendance 

class Course(ndb.Model): 
    code=ndb.StringProperty() 
    title=ndb.StringProperty() 
    #time=ndb.TimeProperity 
    #students= ndb.StructuredProperty(Students, repeated=True) 
    #attendance 

class Attendance(ndb.Model): 
     courseCode=ndb.StructuredProperty(Course) 
     #course=ndb.StructuredProperty(Course, repeated=True) 
     date=ndb.StringProperty() 
     #studentID=ndb.IntegerProperty(repeated=True) 
     student=ndb.StructuredProperty(Student, repeated=True) 
     attendance=ndb.IntegerProperty(repeated=True)# for each student 


class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     #cerate ndb from file 
     coursesfile = open('courses.txt', 'r').read() 
     studentsfile = open('students.txt', 'r').read() 
     dailyattendancefile = open('dailyattendance.txt','r').read() 

     for line in coursesfile.split('\n'): 
      line=coursesfile.split('\t') 
      #stroe courses to datastore 
      course=Course(code=line[0],title=line[1])#create Course entity 
      course.put() 

     for line in studentsfile.split('\n'): 
      line=studentsfile.split('\t') 
      student=Student(id=int(line[0]),name=line[1],email=line[2]) 
      student.put() 

     for line in dailyattendancefile.split('\n'): 
      line=dailyattendancefile.split('\t') 
      attendance=Attendance(courseCode=Course(code=line[0]),date=line[1],student=Student(id=int(line[2])),attendance=int(line[3])) 
      attendance.put() 

#print to html to test 
     #self.response.out.write("<tr><td>"+ course.code + "</td>") 
     #self.response.out.write("<td>"+ course.title+ "</td>") 
     #self.response.out.write("</tr>")    
     self.response.out.write(""" 
     <html> 
     <body> 
     <form method="post" align="left"> 
      <select align="center" name="course_code"> 
      <option value="cs681" selected>CS681</option> 
      <option value="cs681">CS611</option> 
      </select> 

      <input type="submit" value="Submit"/> 

     """) 
    def post(self): 
#get info from user 
     coursecode=self.request.get('course_code') 
     #self.response.out.write(Attendance.courseCode.code) 
     self.response.out.write(""" 
    <table align="center" > 
     <tr align="center"> 
     <td>Course code</td> 
     <td>Student ID</td> 
     <td>Date</td> 
     <td>Attendance</td> 
    </tr> 
""") 
     qry=Attendance.query(Attendance.courseCode.code==coursecode).fetch() 
     for ent in qry: 
      self.response.out.write('<tr><td>%s</td></tr>' %ent.courseCode) 

     self.response.out.write(""" 
    </table> 
</form> 
</body> 
</html> 
     """) 

app = webapp2.WSGIApplication([ 
    ('/', MainHandler) 
], debug=True) 

回答

0

嘗試以下。我認爲您的架構定義中存在一個小問題。

class Course(ndb.Model): 
    code=ndb.StringProperty(indexed=True) 
    title=ndb.StringProperty() 
+0

對不起已經嘗試過,但沒有工作 – user3023449

0

被修改:ⅰ修改了代碼如下但還沒有結果 的目標是與當然碼等於所選擇的代碼顯示出席實體。併爲每個實體(當然,到目前爲止,學生,出勤率)我想獲得學生(從嵌入式類OBJ接入信息)的電子郵件中短 :再去讀喜歡做這樣的事情: SELECT course.code,當然.date,student.id,student.email,考勤 FROM出勤ABB2 LEFT JOIN課程,ABB1 ON ABB1.code = ABB2.course.code

   # -*- coding: cp1256 -*- 

      import webapp2 
      import os 
      import cgi 
      from google.appengine.ext import ndb 
      from google.appengine.api import users 
      from google.appengine.api import mail 
      from google.appengine.ext.webapp import template 


      class Student(ndb.Model): 
       id = ndb.IntegerProperty() 
       name = ndb.StringProperty() 
       email = ndb.StringProperty() 
       #courses= ndb.StructuredProperty(Courses, repeated=True) and attendance 

      class Course(ndb.Model): 
       code=ndb.StringProperty()#indexed=True) 
       title=ndb.StringProperty() 
       #time=ndb.TimeProperity 
       #students= ndb.StructuredProperty(Students, repeated=True) 
       #attendance 

      class Attendance(ndb.Model): 
        #courseCode=ndb.KeyProperty(Course) 
        course=ndb.KeyProperty()#, repeated=True) 
        date=ndb.StringProperty()#ndb.DateProperty() 
        #studentID=ndb.IntegerProperty(repeated=True) 
        student=ndb.KeyProperty() 
        attendance=ndb.IntegerProperty()#repeated=True)#, choices=set(["present", "absent", "late"]))#for each student 
        @classmethod 
        @ndb.tasklet 
        def get_attend_async(attend):  
         result = attend.to_dict() 
         student = attend.student.get_async() 
         result['student'] = { 'id' : student.id, 'name' : student.name,'email':student.email } 
         raise ndb.Return(result) 



      class MainHandler(webapp2.RequestHandler): 
       def get(self): 
        #cerate ndb from file 
        coursesfile = open('courses.txt', 'r') 
        studentsfile = open('students.txt', 'r') 
        attendancefile = open('attendance.txt','r') 

        for line in coursesfile.readlines():    
         line=line.split('\t') 
         #store courses to datastore 
         course=Course(code=line[0],title=line[1])#create Course entity 
         course.put() 
         #self.response.out.write(course.code) 

        for line in studentsfile.readlines(): 
         line=line.split('\t') 
         student=Student(id=int(line[0]),name=line[1],email=line[2]) 
         student.put() 

        for line in attendancefile.readlines(): 
         line=line.split('\t') 
         coursekey=ndb.Key('Course',line[0]) 
         studentkey=ndb.Key('Student',line[2]) 
         attendance=Attendance(course=coursekey,date=line[1],student=studentkey,attendance=int(line[3])) 
         #course=Course(code=line[0]) 
         #student=Student(id=int(line[2])) 
         #course.put() 
         #student.put() 
         #attendance.course=course.put()#put(): returns the ndb.Key of the course obj 
         #attendance.student.append(student.put())#append:since its reapeated property=list 
         attendance.put() 
      #print to html to test 
         #self.response.out.write(attendance.course.get().code)#####->cs681cs681cs611 

        self.response.out.write(""" 
        <html> 
        <body> 
        <form method="post" align="left"> 
         <select align="center" name="course_code"> 
         <option value="cs681" selected>CS681</option> 
         <option value="cs611">CS611</option> 
         </select> 

         <input type="submit" value="Submit"/> 

        """) 
       def post(self): 
      #get info from user 
        coursecode=self.request.get('course_code') 
        #self.response.out.write(coursecode) 
        self.response.out.write(""" 
       <table align="center" > 
        <tr align="center"> 
          <td>Course code</td> 
          <td>Student ID</td> 
          <td>Date</td> 
          <td>Attendance</td> 
        </tr> 
      """) 

        coursekey=ndb.Key('Course',coursecode)#key=(kind,id) 
        course=Course.get_by_id(coursekey.id()) 
        #self.response.out.write(coursekey.id())#Returns the string or integer id in the last (kind, id) pair 
        attendance=Attendance.query(Attendance.course==course).fetch()#'KeyProperty' object has no attribute 'code' 
        self.response.out.write(len(attendance)) 
        self.response.out.write(course) 
        futures=[] 
        for attend in attendance: 
         futures.append(Attendance.get_attend_async(attend)) 
        ndb.Future.wait_all(futures) 
        view_data={} 
        view_data['attendance']=[future.get_result() for future in futures] 


        self.response.out.write(""" 
       </table> 
      </form> 
      </body> 
      </html> 
          """) 

      app = webapp2.WSGIApplication([ 
       ('/', MainHandler) 
      ], debug=True)