2010-11-13 165 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