앱 엔진 GQL : 날짜 범위 쿼리
-
19-09-2019 - |
문제
이 장고 문과 동등한 앱 엔진은 무엇입니까?
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 way, 예를 들어 Post.filter()
또는 created_at.day/month/year
속성?
해결책
당신은 'RelativeDelta'가 필요하지 않습니다 - 당신이 설명하는 것은 datetime.timedelta입니다. 그렇지 않으면, 당신의 대답은 좋아 보인다.
처리 시간이 다가 오는 한, App Engine의 좋은 점은 거의 모든 쿼리가 평범한 비용이 동일한 비용을 가지고 있으며, 이들 모두는 총 데이터 저장소 크기가 아니라 반환 된 레코드에 비례하여 비례 적으로 규모입니다. 따라서 솔루션은 제대로 작동합니다.
또는 다른 것을 위해 하나의 불평등 필터가 필요한 경우 'create_day'dateProperty를 추가하고 간단한 평등을 확인할 수 있습니다.
다른 팁
어때
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 스타일로 체인하는데, 아직 너무 피스닉은 아니지만 아직 쓰기가 더 편안하고 건조기가 많습니다. :) 아마도 더 많은 데이터베이스 처리 시간이 필요할 것이기 때문에 여전히 가장 좋은 방법인지 확실하지 않습니까?
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를 사용할 수 있습니다. 날짜 범위 또는 날짜 델타를 찾을 수 있습니다.