Рабочие объекты даты и времени в Google App Engine - PullRequest
1 голос
/ 13 ноября 2010

В этой модели

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)

Я задавал тот же вопрос в нескольких другихфорумы, и я получил хороший и ценный совет, но я все еще не могу заставить этот код работать, потому что я запутался (объекты, экземпляр, datetime.datetime, секунды, секунда и т. д.) Например, я думал, что

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, но все предметы имели одинаковое число.

См. также мой предыдущий вопрос на ту же тему.

Спасибо за вашу помощь.

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
>>> 

Не уверен, как включить это в сценарий.Любые предложения?

РЕДАКТИРОВАТЬ

@ Константин:

Для элемента

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 Ответ

1 голос
/ 13 ноября 2010

Это должно делать то, что вы хотите:

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

См. mktime.

mCOUNT / mDATE0.date терпит неудачу, потому что нет оператора деления для int и date.

toordinal вас не устраивает, поскольку он работает с датами и полностью игнорирует время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...