Было бы полезно, если вы опубликуете код вашей модели и код "делать вещи", который вы пропустили. Таким образом, мы могли бы понять, как сделать эффективный запрос в вашем случае.
Тем не менее, я думаю это может быть полезным. Он охватывает некоторые случаи, которых select_related
нет. Обратите внимание, что prefetch_related
доступно начиная с Django 1.4 , поэтому вам может потребоваться обновление до этой версии, чтобы использовать его.
Для нас очень важно помочь вам добавить сюда свой код "делать вещи", и, если он уместен (и я думаю, что это будет), добавить сюда код вашей модели (только объявления полей будут в порядке). Потому что способ получения оптимизированного запроса зависит от того, как связаны ваши модели и как вы используете результаты набора запросов.
EDIT:
Чтобы оптимизировать последнее «для» вашего последнего примера, вы можете сделать это:
failed_grades = Grade.objects.filter(course__department=department,course__courseenrollment__user=student,grade__lte=70).select_related('course')
for failed_grade in failed_grades:
print grade.course
print grade.grade
В этом примере, когда вы делаете grade.course
, часть select_related
этого запроса кэширует все курсы, связанные с отфильтрованными оценками, поэтому вы можете использовать их, выполняя только один запрос. Таким образом, если метод __unicode__
модели курса использует только свои собственные поля (я имею в виду, если вы не показываете какие-либо другие данные модели в методе unicode курса), вы должны получить более высокую производительность (меньше запросов) ) что в вашем примере. Я не уверен, как улучшить других для заявлений, как вы хотите. Но я думаю, что это может помочь вам получить то, что вы хотите (возможно, я не слишком разбираюсь в ваших моделях, чтобы помочь вам лучше)