Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2013 23:30:35

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

сортировка queryset-a

Доброго времени суток!
Есть некая модель:

class ModelA(models.model):
field1=models.PositiveIntegerField(default=0)
field2=models.TextField(max_length=5000)
....
field35=models.asdfasds()

Моделька содержит несколько тысяч таких вот не маленьких строк.
Нужно сделать queryset, да такой, что бы сортировка была по возрастанию, но все строчки, где field1==0 - были в конце.
У меня пока в уме два варианта:
Первый - разбить на части, преобразовать в списки и объединить:
q1=list(ModelA.objects.filter(field1__gt=0).order_by(“field1”)
q2=list(ModelA.objects.filter(field1=0)
return q1+q1
Основная проблема в том, что такой подход сожрет слишком много памяти. При таких больших строчках, большой таблице и большом количестве посетителей этот подход не реален.

Второй вариант - Raw-sql:
“select * from app_modela where field1<>0 order by field1 asc
union
select * from app_modela where field1=0;”
из минусов - заточенность под конкретную субд, чего не хотелось бы.

Идеальным вариантом было бы разбить на два queryset-а, не затягивая их в список, и объединить. Но, погуглив не нашел какого-то способа объединить их.
Может кто-нибудь уже сталкивался с подобной задачей. Кто как решил?



Офлайн

#2 Фев. 24, 2013 12:48:24

alafin
Root
От: Киев, Украина
Зарегистрирован: 2006-04-06
Сообщения: 756
Репутация: +  3  -
Профиль   Отправить e-mail  

сортировка queryset-a

Попробуйте как-то так:

ModelA.objects.extra(select={'custom_order': "field1 > 0"}).order_by('-custom_order', 'field1')



Отредактировано alafin (Фев. 24, 2013 14:00:11)

Офлайн

#3 Фев. 24, 2013 19:27:01

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

сортировка queryset-a

Большое спасибо! Помогло.



Офлайн

#4 Окт. 8, 2013 10:10:23

quadright
Зарегистрирован: 2013-07-26
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

сортировка queryset-a

А как такое же реализовать если в модели есть ForeignKey?

order_str = order+" > 0"
transmit = models.tv_transmits.objects\
    .values('id', 'othertable__id', 'othertable__title')\
    .extra(select={'field': order_str}).order_by('-field',order)
Подозреваю .extra и .values не стыкуются? Но как такую сортировку реализовать?

Офлайн

#5 Окт. 8, 2013 10:49:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

сортировка queryset-a

Зачем здесь экстра? Штатными средствами всё решается.
Чего Вы сделать то хотите?



Офлайн

#6 Окт. 8, 2013 11:17:12

quadright
Зарегистрирован: 2013-07-26
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

сортировка queryset-a

Как написано выше:

Dr.Livsi
Нужно сделать queryset, да такой, что бы сортировка была по возрастанию, но все строчки, где field1==0 - были в конце.

Такую же реализацию хочу, скажем есть записи с othertable__id и есть с его отсутствием. Разместить по возврастающей вначале те строки что NOT NULL, а после уже NULL. Штатными средствами NULL выводятся первыми.

Отредактировано quadright (Окт. 8, 2013 11:18:04)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version