按部分日期过滤

时间:2011-04-01 19:22:49

标签: google-app-engine google-cloud-datastore

我的模特

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()

我需要在上个月获得行。我使用交互式控制台。什么时候做这样的过滤

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

我得到"IndexError: The query returned fewer than 1 results"

2 个答案:

答案 0 :(得分:3)

我在谷歌应用引擎小组中获得了类似你的解决方案。

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 

答案 1 :(得分:1)

要基于一个月进行查询,我建议您在模型中添加一个额外的派生字段,该字段会在保存对象时自动更新:

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)

修改:重新阅读您的问题,看起来您并不是真的在寻找某个月的所有帖子(例如任何一年的10月),而只是在一个月内发帖。如果是这种情况,那么您应该能够将查询修改为简单比较:

# 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))

编辑#2 As noted by Nick below,覆盖put()将是错误的形式,因为它仅在作为绑定方法调用时才有效,并且不适用于{ {1}}或其他保存到数据存储区的方法。