Python AppEngine Сортировать по свойству - PullRequest
0 голосов
/ 02 января 2012

У меня есть модель Entry

class Entry(db.Model):
    year = db.StringProperty()
    .
    .
    .

, и по какой-либо причине поле фамилии сохраняется в другой модели.год (или любое другое свойство), используя .order() как бы мне отсортировать его по фамилии?Я новичок в Python, но пришел из Java, я думаю, что есть какой-то эквивалент компаратора;или я совершенно неправ, и есть другой способ сделать это.Я точно не могу изменить свою модель в данный момент времени, хотя это может быть решением позже.Какие-либо предложения?

РЕДАКТИРОВАТЬ: В настоящее время я разбиваю результаты по страницам с использованием смещений (переход к курсорам скоро, но я думаю, что это будет той же проблемой).Поэтому, если я попытаюсь отсортировать данные вне хранилища данных, я буду сортировать только текущий набор;Вполне возможно, что первая страница будет иметь все буквы «B», а вторая страница будет иметь «A», поэтому она будет отсортирована только по странице, а не по общему набору.Я облажался, как мои модели в настоящее время настраиваются?

1 Ответ

4 голосов
/ 02 января 2012

Несколько вопросов здесь.

Нет способа выполнить эту сортировку непосредственно в API хранилища данных, ни в Python, ни в Java - как вы, без сомнения, знаете, хранилище данных не является реляционным, и такие косвенные поиски не поддерживаются.

Если бы это было просто прямое отношение один к одному, которое давало вам средство доступа от объекта Entry к LastName, вы могли бы использовать стандартную функцию Python sort для сортировки списка:

entries.sort(key=lambda e: e.last_name.last_name)

(обратите внимание, что это сортирует список на месте, но возвращает None, поэтому не пытайтесь назначить его из него).

Тем не менее, это не сработает, потому что то, что у вас есть на самом деле, это отношение один-ко-многим: потенциально есть много LastNames для каждой записи. Определение фактически признает это: атрибут collection_name, который определяет метод доступа от Entry до LastName, называется last_names, то есть во множественном числе.

Так что то, что вы спрашиваете, на самом деле не имеет смысла: с каким из множества фамилий вы хотите отсортировать? Конечно, вы можете сделать это наоборот - с помощью запроса LastNames, отсортированного по году поступления, - но, учитывая вашу текущую структуру, на самом деле нет никакого способа сделать это.

Должен сказать, хотя, хотя я не знаю остальных ваших моделей, я подозреваю, что вы действительно неправильно установили эти отношения: ReferenceProperty, вероятно, должен жить на Entry, указывая скорее на LastName чем наоборот, как сейчас. Тогда это будет просто вызов сортировки, который я дал выше.

...