2012-09-22 2 views
0

Учитывая модель данных с заголовком строк, говорят:Как обычай рода Джанго QuerySet

class DVD(models.Model): 
    title = models.CharField(max_length=100) 
class DVDAdmin(admin.ModelAdmin): 
    ordering = ('title',) 

sample_titles = {"A Fish Called Wanda", "The Good, the Bad, and the Unsorted", 
       "A River Runs Upstream", "The Incredibles",} 

Я хочу, чтобы создать QuerySet отсортированный по названию, но учитывая название как минус любые ведущие слова, которые в список, например («a», «an», «the»,). Поэтому «The Incredibles» сортирует до «River Runs Upstream» и т. Д. Я не хочу просто обрезать данные либо в базе данных, либо в полученном виде. Я хочу создать внутреннюю настраиваемую сортировку для запросов.

Один из подходов, кажется, что это мощь работы, чтобы создать собственный список изменений, то сортировать QuerySet там, как:

from django.contrib.admin.views.main import Changelist 
class title_sortlist(Changelist): 
    def apply_special_ordering(self, queryset): 
     qs_desc = self.models.objects.all().order_by('-title') 
     return qs_desc 
    def get_query_set(self, request, *args, **kwargs): 
     queryset = super(title_sortlist, self).get_query_set(request) 
     queryset = self.apply_special_ordering(queryset) 
     return queryset 

class DVDAdmin(admin.ModelAdmin): 
    ordering = ('title',) 
    def get_changelist(self, request, **kwargs): 
     return title_sortlist 

Это работает для стандартной сортировки - нисходящая сортировки делает переопределить модели по возрастанию. Однако я не понял, как выполнить запрос и настроить его.

Другая возможность может быть динамически добавить поле к модели, назовем его cut_title, соответственно редактируется, а затем просто сортировать по этому полю. Тем не менее, я только начал читать о динамических изменениях модели, и неясно, как это сделать (не говоря уже о том, что это кажется немного воинственным, а не регулярным патчем обезьяны).

Третий вариант, я читал, что Django имеет параметр extra для запросов, где вы можете добавить дополнительный SQL, включая новые поля. Я понятия не имею, как добавить новое поле SQL, которое представляет отредактированный заголовок, хотя, может быть, может ли Django SQL вызвать функцию Python?

Какой подход, если таковой имеется, был бы лучше всего для сортировки набора запросов с помощью (измененного) заголовка?

+0

Связанный: http://stackoverflow.com/questions/883575/custom-ordering-in-django. –

+0

@bebraw, возможно, но не решение - метод 'sorted', по-видимому, не возвращает запрос. –

+0

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

ответ

0

@bebraw в комментариях на самом деле прав.

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

В вашем случае, если это так же просто, как удалить слова остановки (короткий список статей), вы должны создать обычное поле модели, которое копирует данные из другого поля и удаляет слова остановки.

Преимущества использования регулярного поля БД: вы можете создать индекс БД (например, на UPPER (значение)) и иметь возможность сортировать регистр без учета, поддерживаемый индексом DB (вам нужно будет добавить дополнительное поле с QuerySet .extra для сортировки по UPPER (значение)).

Это позволит быстро сортировать и вызывать постраничные результаты. Если вы все сделаете в Django, вам придется извлечь все данные. Это может быть достаточно быстро для нескольких сотен строк, но не будет уменьшаться вообще, если данные увеличиваются.

ОДНАКО: Будьте внимательны при остановке слов в зависимости от ваших данных. Анти-пример остановки слов - это заголовок «Быть ​​или не быть», который полностью состоит из того, что можно легко классифицировать как стоп-слова и просто уничтожится при прохождении через такой фильтр.

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