Найти - Пользователи
Полная версия: продвинутая сортировка данных
Начало » Django » продвинутая сортировка данных
1 2
sonniy
вот ударился в оптимизацию и усовершенствования
есть код типа :
acc = accounts.objects.filter(account=332198)

if request.GET['Order_by'] == "poz_desc":
acc = accounts.objects.order_by("-name")
order_by_poz = "poz"
elif request.GET['Order_by'] == "poz":
acc = accounts.objects.order_by("name")
order_by_poz = "poz_desc"
ну очень хочется сделать так:
   if request.GET['Order_by'] == "poz_desc":
acc_filter = '.order_by("-name")'
order_by_poz = "poz"
elif request.GET['Order_by'] == "poz":
acc_filter = '.order_by("name")'
order_by_poz = "poz_desc"
acc = accounts.objects.filter(account=332198)%s % acc_filter
это принесет не только уменьшение количества кода но сделает процесс более удобным(ну мне так кажется)
только вот не знаю как сделать
fth
А кто мешает вам сделать так?
   if request.GET['Order_by'] == "poz_desc":
sort_by = "-name"
order_by_poz = "poz"
elif request.GET['Order_by'] == "poz":
sort_by = "name"
order_by_poz = "poz_desc"
acc = accounts.objects.filter(account=332198).order_by(sort_by)
sonniy
sort_by по умолчанию не должен существовать, то есть запрос должен выглядеть так:
accounts.objects.filter(account=332198).order_by()
я смирился с тем что “пустое место” сделать нельзя(или можно?) и выбрал оптимальную начальную сортировку date_create :)
а что делать если мне нужно менять и фильтры ?:

тут уже в кавычки не засунешь :(
fth
sonniy
сделать нельзя(или можно?)
А почему бы не проверить лично?
У меня .order_by() прекрасно выдаёт результат.
sonniy
у меня тоже выдает, у меня даже все работает :)
моя проблема в том что я пытаюсь сделать фильтры/сортировки уже на сформировавшейся странице
по сути цель примитивная:
даем запрос -> получаем результат(таблицу) -> и дальше мы должны дать возможность сортировать по столбцам А-я и Я-а
по средствам шаблона(я имею ввиду “reversed”) можно это сделать но только относясь к первому столбцу, можно попробовать извращаться с шаблоном( и думаю что добиться можно результата), но неужели нет другого способа более оптимистичного и оптимизированного ?
fth
Может вам стоит посмотреть в сторону джаваскрипта? (думаю неплохое решение в случае если отсутствует деление на страницы)
Ну или как вариант, указывайте сразу в GET запросе тип сортировки и вставляете его в order_by.
Doberman26rus
по идее так должно работать. Не претендую на звание лучшего решения, но один раз приходилось использовать такой подход. а так стараюсь избегать подобных методов.
acc = exec('accounts.objects.filter(account=332198)%s'  %acc_filter)
sonniy
fth
Ну или как вариант, указывайте сразу в GET запросе тип сортировки и вставляете его в order_by.
по сути я так и делаю и скажем так… первый раз проходит без проблем, я видимо не так изначально задумал проверки на наличие изменений в GET/POST запросах, ну да ладно как все доделаю напишу решение,вдруг кому поможет.

У меня появилась еще одна “маленькая” проблема:
я очень хотел связать две таблицы по ФК уже после того как они были созданы и наполнены, изменяя модели базы и делая syncdb, я никаких изменений не получаю, кроме как ошибки на странице использующую таблицу в которой указан ФК

ошибка типа “нет такого столбца в запросе” :(1054, “Unknown column ‘actions.account_id_id’ in ‘field list’”)
и вот тут я стремаюсь лезть в базу и хочу услышать дельный совет
fth
syncdb не изменяет существующие таблицы, только создаёт отсутствующие.
Поэтому либо руками допиливайте базу данных, либо удаляйте таблицы и делайте syncdb.
sonniy
так я допилял :)в общем есть две таблицы accounts и actions:
в моделе actions прописал поле
ac = models.ForeignKey(accounts)
в базе наростил столбец ac_id сделал его форен кеем к таблице accounts к столбцу id
пытаюсь тестить в шеле дабы не навредить существующему потоку, делаю например так:
>>>from mysite.myapp.models import accounts, actions
>>>a = actions.objects.get(id=4306)
>>>a.ac_id.name #вот тут должен быть мега фокус вызывающий нужную строку из другой таблицы, но я увы получаю следующее :
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'long' object has no attribute 'name'
вот в чем тут соль, я перечитал книгу по Django, автор твердо уверен что это должно работать, полистав онлайн доки я тоже твердо увере что должно работать, но что то не работает :(
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB