我正在创建一个应用程序,在任何一天,每天只能创建一个实体。这是模型:
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
问题在于我无法比较这样的两个日期。如何检查实体是否已经创建'今天'?
答案 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")