Найти - Пользователи
Полная версия: сортировка queryset-a
Начало » Django » сортировка queryset-a
1
Dr.Livsi
Доброго времени суток!
Есть некая модель:
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-а, не затягивая их в список, и объединить. Но, погуглив не нашел какого-то способа объединить их.
Может кто-нибудь уже сталкивался с подобной задачей. Кто как решил?
alafin
Попробуйте как-то так:
ModelA.objects.extra(select={'custom_order': "field1 > 0"}).order_by('-custom_order', 'field1')
Dr.Livsi
Большое спасибо! Помогло.
quadright
А как такое же реализовать если в модели есть 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 не стыкуются? Но как такую сортировку реализовать?
FishHook
Зачем здесь экстра? Штатными средствами всё решается.
Чего Вы сделать то хотите?
quadright
Как написано выше:
Dr.Livsi
Нужно сделать queryset, да такой, что бы сортировка была по возрастанию, но все строчки, где field1==0 - были в конце.

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