App Engine GQL: запрос диапазона дат - PullRequest
0 голосов
/ 03 октября 2009

Что будет эквивалентом App Engine этого оператора Django?

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

Но это довольно ужасно по сравнению с Джанго. Любой другой способ Pythonic / Django-magic, например с Post.filter() или created_at.day/month/year атрибутами?

Ответы [ 4 ]

5 голосов
/ 08 октября 2009

Как насчет

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 голос
/ 05 октября 2009

Вам не нужна'lativedelta '- вы описываете datetime.timedelta. В противном случае ваш ответ выглядит хорошо.

Что касается времени обработки, то в App Engine приятно то, что почти все запросы имеют одинаковую цену за результат - и все они масштабируются пропорционально возвращаемым записям, а не общему размеру хранилища данных. Таким образом, ваше решение работает нормально.

В качестве альтернативы, если вам нужен один фильтр неравенства для чего-то другого, вы можете добавить DateProperty «create_day» и выполнить простую проверку на равенство.

0 голосов
/ 23 октября 2009

Кстати, вы можете использовать datetime.timedelta. Это позволяет вам находить диапазоны дат или дельты дат.

0 голосов
/ 04 октября 2009

Завершено использованием библиотеки 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 представление или еще один фильтр.

...