Движок приложений GQL:запрос диапазона дат
-
19-09-2019 - |
Вопрос
Каким был бы эквивалент 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])
Но это довольно ужасно по сравнению с Django.Любой другой, более питонический / Джанго-магический способ, напримерс Post.filter()
или created_at.day/month/year
атрибуты?
Решение
Вам не нужен 'relativedelta' - то, что вы описываете, является datetime.timedelta.В остальном ваш ответ выглядит хорошо.
Что касается времени обработки, то преимущество App Engine заключается в том, что почти все запросы имеют одинаковую стоимость за результат - и все они масштабируются пропорционально возвращаемым записям, а не общему размеру хранилища данных.Таким образом, ваше решение работает нормально.
В качестве альтернативы, если вам нужен фильтр одного неравенства для чего-то другого, вы могли бы добавить свойство DateProperty 'created_day' и выполнить простую проверку на равенство для этого.
Другие советы
Как насчет
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()
В итоге я использовал relativedelta
библиотека + объединение фильтров в цепочку в стиле jQuery, который, хотя и не слишком похож на Python, все же немного удобнее в написании и намного суше.:) Все еще не уверен, что это лучший способ сделать это, поскольку это, вероятно, потребует больше времени обработки базы данных?
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
просмотр или еще один фильтр.
Кстати, вы могли бы использовать datetime.timedelta.Это позволяет вам находить диапазоны дат или дельты дат.