2009-10-03 2 views
0

Каким будет эквивалент App Engine этого оператора Django?App Engine GQL: запрос диапазона дат

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 атрибутами?

ответ

1

Вам не нужно «relativedelta» - то, что вы описываете, - это datetime.timedelta. В противном случае ваш ответ выглядит хорошо.

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

Альтернативно, если вам нужен ваш один фильтр неравенства для чего-то еще, вы можете добавить DateProperty 'created_day' и выполнить простую проверку равенства.

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 зрения или еще один фильтр.

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

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

Смежные вопросы