0

Ich erstelle eine App, die an jedem beliebigen Tag nur eine Entität pro Tag erstellen kann. Hier ist das Modell:Ermitteln, ob eine Entität 'heute' erstellt wird

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

Da nur eine Einheit darf pro Tag erstellt werden, wir müssen die MyModel.created Eigenschaft auf das heutige Datum vergleichen:

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 

Das Problem ist, dass ich kann die beiden Daten nicht vergleichen. Wie kann ich prüfen, ob eine Entität bereits "heute" erstellt wurde?

+0

Warum können Sie nicht die beiden Daten wie folgt vergleichen? Erhalten Sie eine Fehlermeldung? –

+0

@TammoHeeren, ein neu erstelltes Datenzeitobjekt enthält jeden Sekunde einen anderen Sekundenwert, so dass der Vergleich fast immer den Wert false zurückgibt. Um das zu umgehen, benutzte ich die 'DateProperty' anstelle der' DateTimeProperty' (siehe meine eigene Antwort unten). – puoyaahhh

Antwort

0

Sie vergleichen ein Objekt DateTime mit einem Objekt Date.

Statt

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

Verwendung

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

Ich erhalte den Fehler: ''DateTimeProperty' Objekt hat kein Attribut 'date'' – puoyaahhh

+0

Hmm. Welche Attribute hat es? Ist es nur eine Schnur? –

+0

@THeeren es ist eine Modelleigenschaft, es ist kein Datetime-Objekt – dmrz

0

Sie können nicht abfragen von created Eigenschaft mit == da Sie nicht wirklich wissen, die genau cre ation Datetime (das ist, was Sie in created aufgrund der auto_now_add=True Option finden)

Aber Sie für die zuletzt erstellte Einheit nicht abfragen und prüfen, ob seine creation Datetime heute ist. Etwas in dieser Richtung:

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 

Oder Sie ein Datetime für die heutigen 00.00.00 und Abfrage für created größer als das berechnen kann.

Oder Sie können die auto_now_add=True Option fallen lassen und explizit created auf eine bestimmte Uhrzeit des Tages (sagen wir genau Mitternacht) und dann können Sie für die Datetime abgleichen, die zu dieser Tageszeit heute passt.

0

eine Reihe Abfrage für einen einzelnen, spezifischen bekannten Wert Verwenden Sie Nachschlag wollen, ist übertrieben und teuer ist, ich eine dieser zwei Lösungen verwenden würde:

1 -

Opfer ein wenig Platz Extra-Immobilien mit einer zusätzlichen Eigenschaft, obwohl es eine pro Tag ist, sollte es keine große Sache sein.

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 - Verwenden Sie [heute] als Entity ID (bevorzugt)

ich eher today als ID für meine Entity verwenden würde, das ist die schnellste/billiger/optimal Ihre abrufen Entität später. Es könnte auch eine Kombination mit etwas anderem sein, d. H. ID=<userid+today>, falls die Entität pro Benutzer ist, oder einfach Benutzeridentität als Eltern (Vorfahren) hinzufügen.So wäre es so etwas wie dieses:

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

ich von DateTimeProperty zu DateProperty die Eigenschaft zu ändern endete. Jetzt kann ich das tun:

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