2009-10-03 42 views
0

该Django语句的App Engine等效项是什么?App Engine GQL:查询日期范围

return Post.objects.get(created_at__year=bits[0], 
          created_at__month=bits[1], 
          created_at__day=bits[2], 
          slug__iexact=bits[3]) 

我已经结束了写这个:

Post.gql('WHERE created_at > DATE(:1, :2, :3) AND created_at < DATE(:1, :2, :4) and slug = :5', 
    int(bit[0]), int(bit[1]), int(bit[2]), int(bit[2]) + 1, bit[3]) 

但相对于Django的这是很可怕的。任何其他更多的Pythonic/Django魔法方式,例如与Post.filter()created_at.day/month/year属性?

回答

1

你不需要'relativedelta' - 你描述的是一个datetime.timedelta。否则,你的答案看起来不错。

就处理时间而言,App Engine的好处在于几乎所有查询都具有相同的每次结果成本 - 并且它们都按比例缩放返回的记录,而不是总数据存储大小。因此,您的解决方案正常工作。或者,如果您需要您的一个不平等过滤器来进行其他操作,您可以添加'created_day'DateProperty,并对此进行简单的相等性检查。

0

结束了使用relativedelta库+ jQuery风格的链接过滤器,虽然不是Pythonic,但是写入和DRYer更舒适。 :)仍然不确定这是否是最好的方法,因为它可能需要更多的数据库处理时间?

date = datetime(int(year), int(month), int(day)) 
... # then 
queryset = Post.objects_published() 
          .filter('created_at >=', date) 
          .filter('created_at <', date + relativedelta(days=+1)) 
          ... 

并传递段落到object_detail视图或另一个过滤器。

5

如何

from datetime import datetime, timedelta 

created_start = datetime(year, month, day) 
created_end = created_start + timedelta(days=1) 
slug_value = 'my-slug-value' 

posts = Post.all() 
posts.filter('created_at >=', created_start) 
posts.filter('created_at <', created_end) 
posts.filter('slug =', slug_value) 

# You can iterate over this query set just like a list 
for post in posts: 
    print post.key() 
0

通过您可以使用datetime.timedelta的方式。这可以让你找到日期范围或日期增量。