Почему запрос GQL не соответствует?
-
21-08-2019 - |
Вопрос
Я хочу создать несколько мини-CMS, которые содержат страницы с URI.
Последний маршрут в моем urls.py указывает на функцию в моем view.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})
И я добавил объект с /work в качестве URI в хранилище данных.
Даже если request.path равен точно «/work», запрос не возвращает совпадения.
Спасибо за любой совет, который вы можете мне дать!
И да, я новичок в Python, App Engine идеально подходит для того, чтобы наконец выучить язык.
Решение
Я нашел решение!
Проблема кроется в модели.
Хранилище данных механизмов приложений не индексирует TextProperty.Использование этого типа было неправильным с самого начала, поэтому я изменил его на StringProperty, который индексируется и, следовательно, какое хранилище данных позволяет нам использовать в предложении WHERE.
Пример рабочей модели:
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()