2011-04-01 3 views
0

Mon modèleFiltrer par une partie de la date

class BaseArticleModel(polymodel.PolyModel): 
    title = db.StringProperty() 
    created_at = db.DateProperty(auto_now_add=True) 
    updated_at = db.DateProperty(auto_now=True) 

class News(BaseArticleModel): 
    body = db.TextProperty() 

J'ai besoin à obtenir des lignes par le mois dernier. J'utilise une console interactive. Quand filtrent comme celui-ci

q = News.all().filter('created_at.month = ',datetime(2011,04,01).month) 
print q[0].title 

Je reçois "IndexError: The query returned fewer than 1 results"

Répondre

1

Pour interroger la base d'un mois, je vous suggère d'ajouter un champ dérivé supplémentaire à votre modèle qui est mis à jour automatiquement lorsque l'objet est enregistré:

class BaseArticleModel(polymodel.PolyModel): 
    title = db.StringProperty() 
    created_at = db.DateProperty(auto_now_add=True) 
    updated_at = db.DateProperty(auto_now=True) 

    # will be auto-generated 
    created_at_month = db.IntegerProperty() 

    def put(self, *args, **kwargs): 
     self.created_at_month = self.created_at.month 
     super(BaseArticleModel, self).put(*args, **kwargs) 

Modifier: relisant votre question, il semble que vous ne cherchez pas vraiment pour tous les messages d'un mois donné (par exemple Octobre de chaque année), mais plutôt seulement les messages en un seul mois. Si tel est le cas, alors vous devriez être en mesure de réviser simplement votre requête à une simple comparaison:

# get News posted in April, 2011 
all_news = News.all() 
all_news.filter('created_at >=', datetime(2011, 4, 1)) 
all_news.filter('created_at <', datetime(2011, 5, 1)) 

Edit # 2: As noted by Nick below, outrepassant put() serait mauvaise forme, car il ne serait efficace que lorsqu'il a été invité une méthode liée, et ne fonctionnera pas avec db.put() ou d'autres façons d'enregistrer dans le magasin de données.

+0

Ne pas passer outre mis à définir les propriétés - vente est appelée que si vous l'appelez directement - si, par exemple, 'db.put (myInstance)' ne parviendra pas à le mettre à jour. –

3

J'ai eu quelque chose comme votre solution dans le groupe Google App Engine.

class BaseArticleModel(polymodel.PolyModel): 
    title = db.StringProperty() 
    created_at = db.DateProperty(auto_now_add=True) 
    updated_at = db.DateProperty(auto_now=True) 
    @db.ComputedProperty 
    def CM(self): 
     return self.created_at.month 
Questions connexes