确定是否创建了一个实体'今天'

时间:2016-10-14 16:01:19

标签: python google-app-engine datetime google-cloud-datastore app-engine-ndb

我正在创建一个应用程序,在任何一天,每天只能创建一个实体。这是模型:

class MyModel(ndb.Model):
    created = ndb.DateTimeProperty(auto_now_add=True)

由于每天只允许创建一个实体,我们需要将MyModel.created属性与今天的日期进行比较:

import datetime

class CreateEntity(webapp2.RequestHandler):
    def get(self):
        today = datetime.datetime.today()
        my_model = MyModel.query(MyModel.created == today).get()

        if my_model:
          # print("Today's entity already exists")
        else:
          # create today's new entity

问题在于我无法比较这样的两个日期。如何检查实体是否已经创建'今天'?

5 个答案:

答案 0 :(得分:1)

我最终将该属性从DateTimeProperty更改为DateProperty。现在我能够做到这一点:

today_date = datetime.datetime.today().date()
today_entity = MyModel.query(MyModel.created == today_date).get()

答案 1 :(得分:0)

您正在将DateTime对象与Date对象进行比较。

而不是

my_model = MyModel.query(MyModel.created == today).get()

使用

my_model = MyModel.query(MyModel.created.date() == today).get()

答案 2 :(得分:0)

似乎唯一的解决方案是使用“范围”查询,这里是一个相关的答案https://stackoverflow.com/a/14963648/762270

答案 3 :(得分:0)

您无法使用created ==属性进行查询,因为您实际上并不知道完全创建日期时间(这就是您所需要的#39} ;由于created选项而在auto_now_add=True找到

但您可以查询最近创建的实体,并检查其creation日期时间是否为今天。这些方面的东西:

class CreateEntity(webapp2.RequestHandler):
    def get(self):
        now = datetime.datetime.utcnow()
        # get most recently created one:
        entity_list = MyModel.query().order(-MyModel.created).fetch(limit=1)
        entity = entity_list[0] if entity_list else None
        if entity and entity.created.year  == now.year and \
                      entity.created.month == now.month and \
                      entity.created.day   == now.day:
            # print("Today's entity already exists")
        else:
            # create today's new entity

或者您可以计算今天早上0:00:00的日期时间,并查询大于此的created

或者您可以删除auto_now_add=True选项并将created显式设置为当天的特定时间(比如完全是午夜),然后您可以查询与当天某个时间匹配的日期时间。< / p>

答案 4 :(得分:0)

对要查找的单个特定已知值使用范围查询是过度且昂贵的,我会使用以下两种解决方案之一:

1 - 额外财产

用一个额外的财产来牺牲一点空间,虽然因为它是每天一个,所以它不应该是一个大问题。

from datetime import datetime


class MyModel(ndb.Model):

    def _pre_put_hook(self):
        self.date = datetime.today().strftime("%Y%m%d")

    created = ndb.DateTimeProperty(auto_now_add=True)
    date = ndb.StringProperty()


class CreateEntity(webapp2.RequestHandler):

    def get(self):
        today = datetime.today().strftime("%Y%m%d")

        my_model = MyModel.query(MyModel.date == today).get()

        if my_model:
            logging.info("Today's entity already exists")
        else:
            # MyModel.date gets set automaticaly by _pre_put_hook
            my_model = MyModel()
            my_model.put()
            logging.info("create today's new entity")

2 - 使用[今天]作为实体ID(首选)

我宁愿使用today作为我的实体的 ID ,这是以后检索实体的最快/更便宜/最佳方式。它也可以是其他东西的组合,即ID=<userid+today>,如果该实体是每个用户,或者可能只是将userid添加为父(祖先)。所以它会是这样的:

from datetime import datetime


class MyModel(ndb.Model):
    created = ndb.DateTimeProperty(auto_now_add=True)


class CreateEntity(webapp2.RequestHandler):

    def get(self):
        today = datetime.today().strftime("%Y%m%d")

        my_model = MyModel.get_by_id(today)

        if my_model:
            logging.info("Today's entity already exists")
        else:
            my_model = MyModel(id=today)
            my_model.put()
            logging.info("create today's new entity")