2010-11-13 233 views
1

工作datetime對象在這個模型中在谷歌應用程序引擎

class Rep(db.Model): 
    mAUTHOR = db.UserProperty(auto_current_user=True) 
    mUNIQUE = db.StringProperty() 
    mCOUNT = db.IntegerProperty() 
    mDATE = db.DateTimeProperty(auto_now=True) 
    mDATE0 = db.DateTimeProperty(auto_now_add=True) 
    mWEIGHT = db.IntegerProperty() 

我想做的事:

mWEIGHT = mCOUNT/mDATE0 
內這個

for循環

for i in range(len(UNIQUES)):       
     C_QUERY = Rep.all() 
     C_QUERY.filter("mAUTHOR =", user) 
     C_QUERY.filter("mUNIQUE =", UNIQUES[i]) 
     C_RESULT = C_QUERY.fetch(1)     
     if C_RESULT: 
      rep=C_RESULT[0] 
      rep.mCOUNT+=COUNTS[i] 
      # how to convert mDATE0 to integer so that I can divide: 
      # rep.mWEIGHT = rep.mCOUNT/rep.mDATE0 
      rep.put() 
     else: 
      C = COUNTS[i] 
      S = UNIQUES[i] 
      write_to_db(S, C) 

我問同樣的問題在幾個其他論壇,我得到了好的和有價值的建議,但我仍然無法使這個代碼的工作,因爲我很困惑(對象,inst例如,我認爲

mWEIGHT = mCOUNT/rep.mDATE0.second 

會將mDATE0轉換爲秒;但它沒有,它只是把第二部分從2010-11-12 18:57:27.338000即27

而且

mWEIGHT = mCOUNT/mDATE0.date 

給出了一個類型不匹配的錯誤消息。

我也試過

rep.mWEIGHT = rep.mCOUNT/rep.mDATE0.toordinal() 

這給了許多喜歡734088但所有的項目有相同的號碼。

另請參閱我的previous question關於同一主題。

謝謝你的幫助。

EDIT3

這工作,謝謝!

if C_RESULT: 
    rep = C_RESULT[0] 
    rep.mCOUNT+=COUNTS[i] 
    utc_tuple = rep.mDATE0.utctimetuple() 
    # this is actually float not integer 
    mDATE0_integer = time.mktime(utc_tuple) 
    mDATE0_day = mDATE0_integer/86400 
    rep.mWEIGHT = float(rep.mCOUNT/mDATE0_day) 
    rep.put() 

EDIT2 @Constantin:我意識到,號碼也必須花車:

>>> mCOUNT = 35 
>>> div = mCOUNT/mDATE0 
>>> div 
0 
>>> div = float(mCOUNT)/float(mDATE0) 
>>> div 
2.7140704010987625e-08 
>>> 

不知道如何把這個給腳本。有什麼建議麼?

編輯

@Constantin:

對於項目

C_RESULT [0] = 「新項目」

這是結果我得到。

new item: 
rep: <__main__.Rep object at 0x052186D0> 
mDATE0_integer: 1289575981 
rep.mCOUNT: 35 
rep.mWEIGHT: 0    

所以

mDATE0_integer = int(time.mktime(rep.mDATE0.utctimetuple())) 

作品,並給出了整數1289575981但這種劃分

rep.mWEIGHT = rep.mCOUNT/mDATE0_integer 

的結果爲0有什麼建議?

回答

1

這應該做你想要什麼:

import time 
mWEIGHT = mCOUNT/time.mktime(mDATE0.utctimetuple()) 

mktime

mCOUNT/mDATE0.date失敗,因爲intdate沒有除法運算符。

toordinal不適合你,因爲它操作日期和完全忽略時間。

+0

非常感謝您的回答。 'mktime'有效,但分區仍然不起作用。我將上面的代碼添加爲編輯。請讓我知道你在想什麼。再次感謝。 – Zeynel 2010-11-13 19:20:04

+0

@Zeynel,很高興爲你工作。是的,'mktime'返回浮點數,是的,你應該留意整數除法('1/3 == 0')和整數截斷('int(0.3)== 0')。 – Constantin 2010-11-14 07:22:20