2010-11-21 55 views
1

我在理解如何使用查詢結果時遇到問題。我問了大約6個問題,但我仍然不明白。我從前面的代碼中複製,並且讓它以某種方式工作,但是由於我不瞭解底層概念,所以如果我稍作改動,代碼就會崩潰。如果你能告訴我你是如何將這裏發生的事情形象化並向我解釋,我將非常感激。謝謝。IndexError:列表索引超出範圍(在查詢結果中)

class ReceiveEmail(InboundMailHandler): 
    def receive(self, message): 
     logging.info("Received email from %s" % message.sender) 
     plaintext = message.bodies(content_type='text/plain') 
     for text in plaintext: 
      txtmsg = "" 
      txtmsg = text[1].decode() 
      logging.info("Body is %s" % txtmsg) 
      logging.info("CC email is %s" % ((message.cc).split(",")[1]))    

     query = User.all()   
     query.filter("userEmail =", ((message.cc).split(",")[1])) 
     results = query.fetch(1)     

     for result in results:      
      result.userScore += 1     

     um = results[0]        
     um.userScore = result.userScore    
     um.put() 

在這段代碼中,據我所知,查詢從cc列表中獲取第二個電子郵件地址並獲取結果。

然後,我通過增加1

接下來的userScore,我想更新在數據存儲這個項目,所以我說

 um = results[0]        
     um.userScore = result.userScore    
     um.put() 

但是,這給出了一個索引超出範圍的錯誤:

um = results[0] 
IndexError: list index out of range 

爲什麼?我在想象,results[0]是結果的第零項。爲什麼它超出範圍?唯一我能想到的是,名單可能是None。但我不明白爲什麼。它必須有1個被取出的物品。

另外,如果我試圖通過改變從[1] [0]

query.filter("userEmail =", ((message.cc).split(",")[0])) 

然後我沒有得到IndexError索引測試的第一個電子郵件地址。

我在這裏做錯了什麼?

謝謝!

編輯

看評論:

(message.cc).split(",")[0]) 

在電子郵件(從第二個電子郵件)的前留下了空間,因此查詢不匹配他們。

>>> cc.split(",") 
['[email protected]', ' [email protected]', ' [email protected]'] 

加空格逗號解決了這一問題後:

>>> listcc = cc.split(", ") 
>>> listcc 
['[email protected]', '[email protected]', '[email protected]'] 
>>> 
+1

你有多確定有首次獲取結果? – 2010-11-21 04:23:34

+0

是的,很好的問題。我從包含'user11 @ example.com'和'cc777 @ example.com'的cc字段開發者控制檯入站郵件發送電子郵件。我確定這兩封電子郵件已經在數據庫中,以便查詢可以獲取它們。但我只是再次嘗試索引0和1都不工作。你能提出任何方法來檢查查詢所見嗎?謝謝。 – Zeynel 2010-11-21 04:44:57

+0

@Ignacio Vazquez-Abrams:你可能是對的;查詢出現失敗:如果結果: 結果爲在結果中: result.userScore + = 1 微米=結果[0] um.userScore = result.userScore um.put() 否則: logging.info (「查詢失敗」) – Zeynel 2010-11-21 04:57:53

回答

1

理解代碼分解,並通過一塊看看吧件:

class ReceiveEmail(InboundMailHandler): 
    def receive(self, message): 
     logging.info("Received email from %s" % message.sender) 

     # Get a list of CC addresses. This is basically a for loop. 
     cc_addresses = [address.strip() for address in message.cc.split(",")] 
     # The CC list goes with the message, not the bodies. 
     logging.info("CC email is %s" % (cc_addresses)) 

     # Get and iterate over all of the *plain-text* bodies in the email. 
     plaintext = message.bodies(content_type='text/plain') 
     for text in plaintext: 
      txtmsg = "" 
      txtmsg = text[1].decode() 
      logging.info("Body is %s" % txtmsg) 

     # Setup a query object. 
     query = User.all() 
     # Filter the user objects to get only the emails in the CC list. 
     query.filter("userEmail IN", cc_addresses) 
     # But, only get at most 10 users. 
     users = query.fetch(10) 

     logging.info('Got %d user entities from the datastore.' % len(users)) 

     # Iterate over each of the users increasing their score by one. 
     for user in users: 
      user.userScore += 1 

     # Now, write the users back to the datastore. 
     db.put(users) 
     logging.info('Wrote %d user entities.' % len(users)) 

我會做調整到你的模型結構。當您創建用戶實體時,我會將key_name設置爲電子郵件地址。您將能夠使您的查詢更加高效。

一些參考:

+0

Hello Robert:謝謝你的詳細解釋。這非常有幫助。我研究了你引用的三個鏈接。特別感謝修改和組織代碼;現在它變得更有意義。在put()的情況下,我明白我們通過從'userEmail'列中過濾'cc_addresses'從表'User'獲取了10行。然後我們更新'userScore'和'db.put(users)'我們將我們更新的行寫回數據存儲。查看開發控制檯的數據存儲查看器;我明白了,應用引擎知道只更新'userScore'。 – Zeynel 2010-11-21 23:00:03

+0

它實際上更新了實體的所有屬性,但因爲我們只更改了'userScore',所以它是唯一更改的屬性。 – 2010-11-22 00:54:05

相關問題