Сортировка свойства StringListProperty на основе положения элемента в обработчике приложения - PullRequest
1 голос
/ 14 июля 2010

У меня есть модель, которая выглядит следующим образом:

class Example (db.Model) :
 name = db.StringProperty()
 tags = db.StringListProperty()

Сначала я запрашиваю тег для получения списка объектов, у которых они есть:

results = Example.all().filter("tags =", tagSearch).fetch(100)

Это дает мне списокобъектов, содержащих «tagSearch» в их списке «тегов».

Вот как будет выглядеть пример получаемых объектов:

entityA = [tagSearch, m, n, o, ....]

entityB = [a, b, c, tagSearch, ... ]

entityC = [a, tagSearch, a, ,a ,x ....... ....]

Я хочу отсортировать все объекты внабор результатов на основе позиции элемента tagSearch в них в порядке убывания.

basically - entityA, entityC, entityB 

Как мне это сделать?примечание: я запускаю это на appengine ...

также предположение, что tagSearch будет встречаться только один раз в любом списке.

Любая помощь будет высоко оценена.

Ответы [ 3 ]

2 голосов
/ 19 июля 2010

Единственный способ сделать это - изменить список тегов, включив в него позиции, и использовать фильтр неравенства.Например, вы можете изменить теги в формате «тег: ординал», где ординал - это позиция в списке (следовательно, entityA будет иметь ["tagSearch:0", "m:1", "n:2", "o:3"]).Затем вместо выполнения фильтра равенства выполняется запрос, подобный следующему:

results = Example.all().filter("tags >=", tagSearch + u":").filter("tags <", tagSearch + u":\ufffd").fetch(100)

Таким образом, набор результатов будет упорядочен по позиции, в которой искомый тег отображается в списке.Недостатком является то, что теперь вы можете запрашивать только один тег за раз - несколько фильтров неравенства невозможны в App Engine.

1 голос
/ 14 июля 2010

Я согласен с Джейсоном Холлом, что, учитывая вашу модель, ее невозможно выполнить с запросом.

Вы можете попробовать изменить модель на что-то вроде этого:

class Example (db.Model) :
    name = db.StringProperty()

class ExampleTag(db.Model):
    example_id = db.IntegerProperty()
    tag_name = db.StringProperty()
    tag_rank = db.IntegerProperty()

Затем вы выполняете запрос следующим образом:

query = ExampleTag.all()
query.filter('tag_name =', 'tagSearch')
query.order('tag_rank')
tags = query.fetch(100)

examples = Example.get_by_ids([x.example_id for x in tags])
1 голос
/ 14 июля 2010

Насколько я знаю, вы не сможете отсортировать их в запросе. Таким образом, единственная альтернатива - извлечь их все и отсортировать в вашем коде.

Это может быть невыполнимо в зависимости от количества сущностей, которые вы должны вернуть, поэтому вы можете захотеть ограничить сущности другим способом перед извлечением.

...