#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
лучше, чем перебирать.