0

このDjangoステートメントに相当するAppEngineは何でしょうか?

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の方法、たとえばwithPost.filter()created_at.day/month/yearattributesはありますか?

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の優れた点は、ほぼすべてのクエリの結果あたりのコストが同じであり、データストアの合計サイズではなく、返されたレコードに比例してスケーリングされることです。そのため、ソリューションは正常に機能します。

または、他の何かに1つの不等式フィルターが必要な場合は、「created_day」DatePropertyを追加し、それに対して単純な等式チェックを実行できます。

于 2009-10-04T21:37:13.650 に答える
0

ちなみに、datetime.timedeltaを使用できます。これにより、日付範囲または日付デルタを見つけることができます。

于 2009-10-23T01:08:27.760 に答える
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スラグをビューまたはさらに別のフィルターに渡します。

于 2009-10-04T09:35:12.113 に答える