0

这条 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属性?

4

4 回答 4

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()
于 2009-10-08T03:19:42.047 回答
1

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

就处理时间而言,App Engine 的好处是几乎所有查询都具有相同的每次结果成本 - 并且所有查询都与返回的记录成比例地扩展,而不是与数据存储区的总大小成比例。因此,您的解决方案工作正常。

或者,如果您需要一个不等式过滤器来处理其他事情,您可以添加一个“created_day”日期属性,并对其进行简单的相等性检查。

于 2009-10-04T21:37:13.650 回答
0

By the way you could use the datetime.timedelta. That lets you find date ranges or date deltas.

于 2009-10-23T01:08:27.760 回答
0

最终使用relativedelta库 + 以 jQuery 样式链接过滤器,虽然还不是太 Pythonic,但写起来更舒服,而且更干燥。:) 仍然不确定这是否是最好的方法,因为它可能需要更多的数据库处理时间?

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视图或另一个过滤器。

于 2009-10-04T09:35:12.113 回答