这个Django语句的App Engine相当于什么?
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
属性?
答案 0 :(得分: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()
答案 1 :(得分:1)
你不需要'relativedelta' - 你描述的是datetime.timedelta。否则,你的答案看起来不错。
就处理时间而言,App Engine的优点是几乎所有查询都具有相同的每次成本成本 - 并且所有查询都按比例缩放到返回的记录,而不是总数据存储大小。因此,您的解决方案可以正常工作。
或者,如果你需要一个不等式过滤器用于其他东西,你可以添加一个'created_day'DateProperty,并对其进行简单的相等检查。
答案 2 :(得分: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))
...
并将slug传递给object_detail
视图或另一个过滤器。
答案 3 :(得分:0)
顺便说一下,你可以使用datetime.timedelta。这可以让你找到日期范围或日期增量。