0

저는 롤업 등록으로 스터디의 이메일 작업을 처리하기 위해 GAE 데이터 스토어를 사용하고 있습니다. 각 행 (emailJobs)은 참여자를 나타냅니다. 쿼리 할 변수가 12 개 있습니다. 각각은 추적 기간을 나타냅니다 (1에서 12까지). 변수는 특정 후속 기간 동안 사람에게 전자 메일을 보낸 날짜를 나타냅니다. 사람들이 다른 시간에 연구를 시작하기 때문에 모든 사람들이 주어진 시간에 동일한 추적 관찰 기간에 있지는 않습니다.GAE 데이터 저장소 쿼리에 대한 동적 변수 목록을 만들려면 어떻게해야합니까?

나는 특정 후속 기간 내에있는 사람들을 확인하고 그들이 연구의 그 시점에서 받았어야 할 모든 후속 이메일을 받았는지 확인하고자합니다.

저는 관심있는 변수에만 초점을 맞추고 확실히 None 유형 인 변수는 무시함으로써 데이터 저장소를 쿼리하는 데 걸리는 시간을 줄이려고합니다.

이 문제를 해결하기위한 방법은 쿼리에서 대상으로 지정할 변수 목록을 동적으로 만드는 것입니다.

class emailJobs(db.Model): 
    """ Models a list of email jobs for each participant """ 

    date_modified = db.DateTimeProperty(auto_now_add=True, name='Date modified') 
    author = db.StringProperty() # Google account which made changes (for testing) 

    triggerid = db.StringProperty() # TriggerResponseID (connects participants across both panels) 
    recipientid_po = db.StringProperty() # RecipientID - Original Panel 
    recipientid_pdi = db.StringProperty() # RecipientID - De-identified Panel 

    unsubscribed = db.IntegerProperty() # Subscription status 

    recipientlang = db.StringProperty() # RecipientLanguage 
    consent_date = db.DateTimeProperty() # CONSENTDATE datetime (timestamp) 
    test = db.StringProperty() # Identifies test data (TESTDATA = 1) 
    fuperiod = db.IntegerProperty() #Follow-up period (0 - 13: 0-before follow-up, 13-past fu12) 

    last_fu_sent = db.DateTimeProperty() # Datetime last follow-up email was sent 
    fu1_email_sent = db.DateTimeProperty() # **************** 
    fu2_email_sent = db.DateTimeProperty() 
    fu3_email_sent = db.DateTimeProperty() 
    fu4_email_sent = db.DateTimeProperty() 
    fu5_email_sent = db.DateTimeProperty() 
    fu6_email_sent = db.DateTimeProperty() 
    fu7_email_sent = db.DateTimeProperty() 
    fu8_email_sent = db.DateTimeProperty() 
    fu9_email_sent = db.DateTimeProperty() 
    fu10_email_sent = db.DateTimeProperty() 
    fu11_email_sent = db.DateTimeProperty() 
    fu12_email_sent = db.DateTimeProperty() 



class sendMissedFU(webapp2.RequestHandler): 
    """ Queries Datastore for follow-up dates that were missed, then adds them to a task queue so that an email can be sent out """ 
    def get(self): 

     now = datetime.datetime.now() 
     now_dt = now.date() #today's date to compare with follow-up dates 

     q = emailJobs.all() 
     q.filter('consent_date !=', None) # weeds out anyone who doesn't have a consent date 
     q.order('consent_date') 

     for part in q: 

      trigid = part.triggerid 
      lang = part.recipientlang 
      guid = part.recipientid_po 

      consent = part.consent_date 
      consent_date = consent.date() 
      calcdTime = now_dt - consent_date 
      dayssince = calcdTime.days 
      fup = dayssince/30 


      fuemailsent_dict = {} 
      fuemailsent_list = [] 

      for i in range(1, fup + 1): 
       i = str(i) 
       followup = 'fu' + i + '_email_sent' 

       fuemailsent_list.append(followup) 

       fu_check = part.followup 

      if fu_check == None: 
       fuemailsent_dict[followup] = 0 
      else: 
       fuemailsent_dict[followup] = 1 

내가지고있어 오류는 다음과 같습니다 :

AttributeError가 :

fu1_email_sent, fu2_email_sent, ... 여기 fu12_email_sent

코드의 축소 된 버전의 'emailJobs'개체가있다 'followup'속성이 없습니다

싫어요 : fu_check = part.followup ...하지만 어떻게 해야할지 모르겠군요.

+0

를 사용합니다. emailJobs 모델을 포함해야합니다. emailJobs에는 그런 속성이 있습니까? –

+0

모델 – 655321

+0

을 추가했습니다. 코드를 살펴보면,'emailJobs'에는'followup' 속성이 없으므로'fu_check = part.followup'이 어떻게 작동할까요? 예외가 말하고있는 것이 무엇인지 말해줍니다. –

답변

1
for i in range(1, fup + 1): 
     i = str(i) 
     followup = 'fu' + i + '_email_sent' 

     fuemailsent_list.append(followup) 

     fu_check = part.followup 

는 '후속'이라는 속성에 액세스하려고 의미합니다. 줄은 fu_check = part.followup입니다. 변수 followup에 저장된 이름을 사용하려면 우리는 당신이 제공 한 코드에서 말할 수 getattr

fu_check = getattr(part,followup)

관련 문제