Производительность фильтра набора запросов Django

#django #performance #django-models #django-queryset #django-cache

#django #Производительность #django-модели #django-queryset #django-cache

Вопрос:

У меня есть набор запросов :-

 queryset = my_object.someobject_set.all()
  

С этого момента я хочу фильтровать из набора запросов. то есть:

 print queryset.filter(name='some1').exists()
print queryset.filter(name='some2').exists()
print queryset.filter(name='some3').exists()
  

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

Я даже пытался оценить набор запросов перед фильтрацией, выполнив это:-

 print len(queryset)
  

Но это не работает.
Любая помощь??

Комментарии:

1. Или вы имели в виду, что это 3 разных запроса?

2. Да, я имею в виду 3 разных запроса

3. Затем исправьте свой код в примере

4. Уже сделано. Пожалуйста, проверьте еще раз.

5. Смотрите обновленный ответ

Ответ №1:

Это невозможно с помощью django ORM. Но вы можете сделать это на python.

 queryset = list(my_object.someobject_set.all())

print list(filter(lambda i: i.name == 'some1', queryset))
print list(filter(lambda i: i.name == 'some2', queryset))
print list(filter(lambda i: i.name == 'some3', queryset))
  

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

Комментарии:

1. нет необходимости извлекать все столбцы в память. используйте only вместо этого.

2. @itzmeontv я не уверен, что он просто хочет проверить, существуют ли значения или нет. Но да, если это нужно только для проверки only , это путь.

3. о чем вы думаете? перебор списков и проверка наличия поля по сравнению с запросом «существует» в БД? ответ из ваших знаний? 🙂

4. @itzmeontv вы спрашиваете вообще?

5. да, иногда я думаю, что делать exist лучше, чем перебирать.