2012-04-02 4 views
1

Ну, это простой вопрос, я хочу, чтобы два элемента отсортировались по дате.фильтрация только n элементов в модели django

Модель:

Class ModelName(models.Model): 
    usr = models.ForeignKey(UserProfile) 
    created = models.DateTimeField(default=datetime.datetime.now) 

Путь я сделать это:

ModelName.object.filter(param=param).order_by('-created')[:2] 

Согласно моему пониманию того, что я думаю, что происходит за сценой:

  1. Все объекты из ModelName отфильтровываются

  2. они сортируются

  3. только два из них выбраны.

Возможно, я ошибаюсь, если нет, то как я могу фильтровать только последние два элемента в зависимости от даты.

+1

Что вы пытаетесь получить, что вы в настоящее время не получаете? –

+0

Я хотел узнать, была ли какая-либо дальнейшая оптимизация для запроса, который я написал на уровне базы данных. – user993563

+0

Я думаю, что это нормальный способ для РСУБД работать – okm

ответ

0
  • Все объекты ModelName фильтруются
  • они сортируются
  • только два из них будут выбраны.

Да, но это делается по базе данных, а не по python. См. querysets are lazy. Так, что на самом деле работает довольно хорошо, так как все это питон:

qs = ModelName.object.filter(param=param).order_by('-created')[:2] 

будет преобразован в SQL, когда Достаточное количество записей доступны (т. Е для модели в достаточном количестве ...)

+1

просто для nitpick - [slicing заставляет QuerySet оцениваться] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets -are-rated), поэтому в этом случае БД будет немедленно удалена (но только один раз) –

+0

@ TimmyO'Mahony нет, итерация на qs оценивает его. slicing без шага просто устанавливает низкий и высокий конец запроса. 'Нарезка необоснованного QuerySet обычно возвращает еще один неопытный QuerySet, но Django выполнит запрос базы данных, если вы используете параметр« step »синтаксиса slice и вернете список.' – okm

+0

Да, просто прочитайте это снова - я подумал, что " шаг ", обозначаемый' [a: b] '! –

Смежные вопросы