【问题标题】:App Engine GQL: querying a date rangeApp Engine GQL:查询日期范围
【发布时间】:2010-12-03 13:36:30
【问题描述】:

这个 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-magic 方式,例如具有Post.filter()created_at.day/month/year 属性?

【问题讨论】:

    标签: django google-app-engine gql


    【解决方案1】:

    怎么样

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

    【讨论】:

      【解决方案2】:

      您不需要“relativedelta” - 您描述的是 datetime.timedelta。否则,您的答案看起来不错。

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          顺便说一句,您可以使用 datetime.timedelta。这可以让您找到日期范围或日期增量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-23
            • 1970-01-01
            • 2013-10-13
            • 2010-12-20
            • 2011-11-10
            • 2011-06-24
            • 1970-01-01
            相关资源
            最近更新 更多