GQL 쿼리가 일치하지 않는 이유는 무엇입니까?
-
21-08-2019 - |
문제
내가하고 싶은 것은 URI로 페이지를 보유하는 미니 CMS를 구축하는 것입니다.
내 urls.py의 마지막 경로는 my views.py의 함수를 가리 며, 현재 요청의 동일한 URI와 함께 사용할 수있는 페이지가있는 경우 데이터 스토어에서 확인하고 페이지를 표시합니다.
나는 모델이있다 :
class Page(db.Model):
title = db.StringProperty(required=True)
uri = db.TextProperty(required=True)
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
content = db.TextProperty()
내 견해로 :
def show(request):
page = db.GqlQuery('SELECT * FROM Page WHERE uri=:uri', uri=request.path).get()
if page is None:
return http.HttpResponseNotFound()
else:
return respond(request, 'pages_show', {'content': request.path})
그리고 데이터 스토어에 URI로 '/work'가있는 엔티티를 추가했습니다.
request.path가 정확히 '/work'인 경우에도 쿼리는 일치를 반환하지 않습니다.
당신이 나에게 줄 수있는 조언에 감사드립니다!
그렇습니다. 저는 파이썬 멍청이입니다. 앱 엔진은 마침내 언어를 배우기에 완벽합니다.
해결책
솔루션을 찾았습니다!
문제는 모델에 있습니다.
App Engines Datastore는 TextProperty를 색인하지 않습니다. 이 유형을 사용하는 것이 처음부터 잘못되었으므로 문자열이 표시되는 StringProperty로 변경하여 인덱스가 발생하여 Where 절에서 사용할 수있는 DataStore가 사용할 수 있습니다.
작업 모델의 예 :
class Page(db.Model):
title = db.StringProperty(required=True)
// string property now
uri = db.StringProperty(required=True)
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
content = db.TextProperty()
다른 팁
명명 된 키워드 인수 ( "uri = : uri")를 사용하는 경우 매개 변수를 명시 적으로 이름을 지정된 키워드에 바인딩해야합니다. 대신에:
# incorrect named parameter
GqlQuery('SELECT * FROM Page WHERE uri=:uri', request.path).get()
당신은 원합니다
# correct named parameter
GqlQuery('SELECT * FROM Page WHERE uri=:uri', uri=request.path).get()
또는 위치 매개 변수 만 사용할 수 있습니다.
# correct positional parameter
GqlQuery('SELECT * FROM Page WHERE uri=:1', request.path).get()
제휴하지 않습니다 StackOverflow