Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 5, 2010 16:02:20

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутая сортировка данных

вот ударился в оптимизацию и усовершенствования
есть код типа :

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
это принесет не только уменьшение количества кода но сделает процесс более удобным(ну мне так кажется)
только вот не знаю как сделать



Офлайн

#2 Ноя. 5, 2010 16:47:38

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутая сортировка данных

А кто мешает вам сделать так?

   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)



Офлайн

#3 Ноя. 5, 2010 17:34:53

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутая сортировка данных

sort_by по умолчанию не должен существовать, то есть запрос должен выглядеть так:

accounts.objects.filter(account=332198).order_by()
я смирился с тем что “пустое место” сделать нельзя(или можно?) и выбрал оптимальную начальную сортировку date_create :)
а что делать если мне нужно менять и фильтры ?:

тут уже в кавычки не засунешь :(



Офлайн

#4 Ноя. 6, 2010 04:47:56

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутая сортировка данных

sonniy
сделать нельзя(или можно?)
А почему бы не проверить лично?
У меня .order_by() прекрасно выдаёт результат.



Офлайн

#5 Ноя. 8, 2010 11:28:28

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутая сортировка данных

у меня тоже выдает, у меня даже все работает :)
моя проблема в том что я пытаюсь сделать фильтры/сортировки уже на сформировавшейся странице
по сути цель примитивная:
даем запрос -> получаем результат(таблицу) -> и дальше мы должны дать возможность сортировать по столбцам А-я и Я-а
по средствам шаблона(я имею ввиду “reversed”) можно это сделать но только относясь к первому столбцу, можно попробовать извращаться с шаблоном( и думаю что добиться можно результата), но неужели нет другого способа более оптимистичного и оптимизированного ?



Офлайн

#6 Ноя. 8, 2010 13:02:42

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутая сортировка данных

Может вам стоит посмотреть в сторону джаваскрипта? (думаю неплохое решение в случае если отсутствует деление на страницы)
Ну или как вариант, указывайте сразу в GET запросе тип сортировки и вставляете его в order_by.



Офлайн

#7 Ноя. 8, 2010 13:43:37

Doberman26rus
От: Ставрополь
Зарегистрирован: 2009-03-16
Сообщения: 128
Репутация: +  1  -
Профиль   Отправить e-mail  

продвинутая сортировка данных

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

acc = exec('accounts.objects.filter(account=332198)%s'  %acc_filter)



подпись

Офлайн

#8 Ноя. 8, 2010 18:17:24

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутая сортировка данных

fth
Ну или как вариант, указывайте сразу в GET запросе тип сортировки и вставляете его в order_by.
по сути я так и делаю и скажем так… первый раз проходит без проблем, я видимо не так изначально задумал проверки на наличие изменений в GET/POST запросах, ну да ладно как все доделаю напишу решение,вдруг кому поможет.

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

ошибка типа “нет такого столбца в запросе” :(1054, “Unknown column ‘actions.account_id_id’ in ‘field list’”)
и вот тут я стремаюсь лезть в базу и хочу услышать дельный совет



Офлайн

#9 Ноя. 9, 2010 11:53:48

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутая сортировка данных

syncdb не изменяет существующие таблицы, только создаёт отсутствующие.
Поэтому либо руками допиливайте базу данных, либо удаляйте таблицы и делайте syncdb.



Офлайн

#10 Ноя. 9, 2010 12:27:40

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутая сортировка данных

так я допилял :)в общем есть две таблицы 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, автор твердо уверен что это должно работать, полистав онлайн доки я тоже твердо увере что должно работать, но что то не работает :(



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version