Так в основном у меня есть довольно большое движение проекта Django. Это - частный веб-портал, который позволяет пользователям управлять различными связанными с телефоном задачами.
Несколько страниц портала предоставляют список Объектов модели пользователям и перечисляют все их атрибуты в HTML-таблице (так, чтобы пользователи могли визуально просмотреть список этих объектов).
Проблема, которую я имею: Я не могу найти Django-выход или pythonic способ обработать сортировку этих Объектов модели именем поля. Как пример того, что я говорю о, вот одно из моих представлений, которое перечисляет все Partyline
Объекты модели:
def list_partylines(request):
"""
List all `Partyline`s that we own.
"""
# Figure out which sort term to use.
sort_field = request.REQUEST.get('sortby', 'did').strip()
if sort_field.startswith('-'):
search = sort_field[1:]
sort_toggle = ''
else:
search = sort_field
sort_toggle = '-'
# Check to see if the sort term is valid.
if not (search in Partyline._meta.get_all_field_names()):
sort_field = 'did'
if is_user_type(request.user, ['admin']):
partylines = Partyline.objects.all().order_by(sort_field)
else:
partylines = get_my_partylines(request.user, sort_field)
variables = RequestContext(request, {
'partylines': partylines,
'sort_toggle': sort_toggle
})
return render_to_response('portal/partylines/list.html', variables)
Код сортировки в основном позволяет пользователям указывать / URL/? параметр sortby=model_field_name, который затем возвратит отсортированный список объектов каждый раз, когда пользователи нажимают на название HTML-таблицы, отображенное на странице.
Так как у меня есть различные представления в различных приложениях, которые все шоу список Объектов модели, и требует сортировки, я задаюсь вопросом, существует ли универсальный способ сделать эту сортировку так, чтобы я не имел к?
Я сожалею, если этот вопрос немного неясен, я изо всех сил пытаюсь найти правильный способ формулировать этот вопрос.
Спасибо.
Я бы посмотрел на это с помощью специального QuerySet. В своей модели вы можете определить класс QuerySet
и добавить туда свою сортировку. Чтобы сохранить всю логику в объекте модели, я бы также переместил содержимое get_my_partylines
в QuerySet.
## This class is used to replicate QuerySet methods into a manager.
## This way: Partyline.objects.for_user(foo) works the same as
## Partyline.objects.filter(date=today).for_user(foo)
class CustomQuerySetManager(models.Manager):
def get_query_set(self):
return self.model.QuerySet(self.model)
def __getattr__(self, attr, *args):
try:
return getattr(self.__class__, attr, *args)
except AttributeError:
return getattr(self.get_query_set(), attr, *args)
class Partyline(models.Model):
## Define fields, blah blah.
objects = CustomQuerySetManager()
class QuerySet(QuerySet):
def sort_for_request(self, request):
sort_field = request.REQUEST.get('sortby', 'did').strip()
reverse_order = False
if sort_field.startswith('-'):
search = sort_field[1:]
else:
search = sort_field
reverse_order = True
# Check to see if the sort term is valid.
if not (search in Partyline._meta.get_all_field_names()):
sort_field = 'did'
partylines = self.all().order_by(sort_field)
if reverse_order:
partylines.reverse()
return partylines
def for_user(self, user):
if is_user_type(request.user, ['admin']):
return self.all()
else:
## Code from get_my_partylines goes here.
return self.all() ## Temporary.
views.py :
def list_partylines(request):
"""
List all `Partyline`s that we own.
"""
partylines = Partylines.objects.for_user(request.user).sort_for_request(request)
В django.contrib.admin.views.main.ChangeList
есть отличный пример того, как это делается в общем виде, хотя это гораздо больше, чем сортируя, вы можете просмотреть его код для некоторых подсказок и идей. Вы также можете посмотреть django.contrib.admin.options.ModelAdmin
метод список изменений
, в частности, чтобы получить больше контекста.