【问题标题】:Determine if an entity is created 'today'确定是否在“今天”创建实体
【发布时间】:2016-10-14 16:01:18
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不能像这样比较两个日期?您收到错误消息吗?
  • @TammoHeeren,一个新创建的数据时间对象每秒都包含一个不同的 seconds 值,因此比较几乎总是返回 false。为了解决这个问题,我最终使用了DateProperty 而不是DateTimeProperty(请参阅下面我自己的答案)。

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


【解决方案1】:

我最终将属性从 DateTimeProperty 更改为 DateProperty。现在我可以这样做了:

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

【讨论】:

    【解决方案2】:

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

    代替

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

    使用

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

    【讨论】:

    • 我收到错误:'DateTimeProperty' object has no attribute 'date'
    • 嗯。它有什么属性。它只是一个字符串吗?
    • @THeeren 这是一个模型属性,它不是一个日期时间对象
    • @THeeren,您已经为我确定了问题所在。我一直在比较 DateTime 和 Date 对象。谢谢你。我通过将 DateTimeProperty 更改为 DateProperty 来解决它。我已经提交了答案。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您不能使用== 查询created 属性,因为您实际上并不知道确切 创建日期时间(这是您在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 显式设置为一天中的特定时间(准确地说是午夜),然后您可以查询与今天该时间匹配的日期时间。

      【讨论】:

        【解决方案5】:

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

        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 - 使用 [today] 作为实体 ID(首选)

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

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

        【讨论】:

          猜你喜欢
          • 2011-01-20
          • 2011-03-11
          • 2015-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-26
          • 2012-01-13
          相关资源
          最近更新 更多