1

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

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 

Как это сделать? note Я запускаю это на appengine ...

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

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

ответ

1

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

Возможно, это невозможно выполнить в зависимости от количества объектов, которые нужно вернуть, поэтому вы можете ограничить объекты каким-либо другим способом перед извлечением.

+0

Проблема заключается в том, что мне придется запускать этот алгоритм во всех извлеченных записях одновременно, чтобы получить правильный набор результатов. Но разве это не очень распространенная проблема, которую я цитирую здесь? Это стандартная проблема сортировки. Было бы шокирующим, если приложение-движок не справится с такой общей проблемой. – demos

+1

Это не похоже на очень распространенную проблему для меня. Как бы вы это сделали в SQL - вы бы сказали, что SQL не может выполнить, не сделав этого легким? –

1

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

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

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]) 
+0

Это решение работает только в том случае, если он только сортирует по одному тегу (например, «thistag», но не «thattag»)! –

2

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

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

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

Смежные вопросы