0

Я создаю приложение, которое в любой день может создаваться только один объект в день. Вот модель:Определить, создан ли объект 'today'

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

Почему вы не можете сравнить эти две даты? Вы получили сообщение об ошибке? –

+0

@TammoHeeren, недавно созданный объект datatime содержит различное значение 'seconds', каждую секунду, поэтому сравнение почти всегда возвращает false. Чтобы обойти это, я закончил использование 'DateProperty' вместо' DateTimeProperty' (см. Мой собственный ответ ниже). – puoyaahhh

ответ

0

Вы сравниваете объект DateTime с объектом Date.

Вместо

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

использования

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

Я получаю сообщение об ошибке: '' Объект DateTimeProperty 'не имеет атрибута' date'' – puoyaahhh

+0

Хмм. Какие атрибуты у него есть. Это просто строка? –

+0

@Теперь это свойство модели, это не объект datetime. – dmrz

0

Вы не можете запросить по created недвижимость с использованием ==, так как вы на самом деле не знаете точный cre ция дата и время (это то, что вы найдете в 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 

Или вы могли бы вычислить DateTime для сегодняшнего 0:00:00 утра и запроса на чем created большие.

Или вы можете удалить опцию auto_now_add=True и явно установить created в определенное время дня (скажем, полночь точно), а затем вы можете запросить дату и время, соответствующие этому времени дня сегодня.

0

Использование запроса диапазона для одного конкретного известно значение, которое вы хотите для поиска является излишеством и дорогим, я хотел бы использовать один из этих 2-х решений:

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 - Использование [сегодня], как Entity 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") 
1

Я в конечном итоге изменить свойство от DateTimeProperty к DateProperty. Теперь я могу это сделать:

today_date = datetime.datetime.today().date() 
today_entity = MyModel.query(MyModel.created == today_date).get() 
Смежные вопросы