Почему GQL Query не совпадает? - PullRequest
1 голос
/ 21 марта 2009

То, что я хочу сделать, это создать несколько мини-cms, которые содержат страницы с URI.

Последний маршрут в моем urls.py указывает на функцию в моем 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}) 

И я добавил сущность с '/ work' в качестве uri в хранилище данных.

Даже если для request.path указано значение «/ work», запрос не возвращает совпадение.

Спасибо за любой совет, который вы можете дать мне!

И да, я нуб-питон, App Engine идеально подходит для окончательного изучения языка.

Ответы [ 2 ]

4 голосов
/ 21 марта 2009

Я нашел решение!

Проблема заключается в модели.

Хранилище данных движков приложений не индексирует 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()
2 голосов
/ 21 марта 2009

Если вы используете аргументы именованного ключевого слова («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()
...