0

任意の日に1日に1つのエンティティしか作成できないアプリを作成しています。こちらのモデルは次のとおりです。エンティティが「今日」作成されているかどうかを確認

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

1つのエンティティのみが日ごとに作成することが許可されているので、我々は今日の日付に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 

問題はそのIでありますこのような2つの日付を比較することはできません。エンティティがすでに「今日」作成されているかどうかを確認するにはどうすればよいですか?

+0

どうしてこのような2つの日付を比較できませんか?エラーメッセージが表示されますか? –

+0

@TammoHeeren、新しく作成されたdatatimeオブジェクトには、毎秒異なる「秒」値が含まれているため、比較ではほとんど常にfalseが返されます。これを回避するために、私は 'DateTimeProperty'の代わりに' DateProperty'を使いました(以下の私自身の答えを見てください)。 – 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

Hmm。それにはどのような属性がありますか?それは単なる文字列ですか? –

+0

@THeerenこれはモデルプロパティです。日時オブジェクトではありません – dmrz

0

ですcreatedプロパティを使用して==を使用しているため、正確に cre

しかし、あなたが最近作成したエンティティを照会し、そのcreation日時が今日であるかどうかを確認できた(あなたが原因auto_now_add=Trueオプションにcreatedで見つけるものです)エーション日時。これらの線に沿って何か:

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 

それとも、それよりも大きなcreatedのために、今日の0時00分00秒午前とクエリの日時を計算することができます。

auto_now_add=Trueオプションを削除し、明示的にcreatedを特定の時刻(真夜中)に明示的に設定して、今日のその時刻と一致する日時を照会することができます。知られている単一の特定のために範囲クエリを使用して

0

あなたがルックアップする値が、私はこれらの2つのソリューションのいずれかを使用することになり、やり過ぎと高価です:

1 - エクストラプロパティ

は少しスペースを生け贄に捧げます余分な財産がありますが、それは1日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として使用します[今日](推奨)

私はむしろそれがあなたを取得するための最速/安い/最適な方法ですが、私のエンティティのIDとしてtodayを使用します後でエンティティ。エンティティがユーザーごとの場合は、ID=<userid+today>と組み合わせることもできますし、親(祖先)としてuseridを追加することもできます。私はDatePropertyDateTimePropertyからプロパティを変更することになった

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

:だから、このようなものになるだろう。今私はこれを行うことができます:

today_date = datetime.datetime.today().date() 
today_entity = MyModel.query(MyModel.created == today_date).get() 
関連する問題