django select_related в шаблоне

Иногда имеет смысл использовать select_related в шаблоне django. Например, скажем, у меня есть класс, расширяющий DetailView

class DemoCarView(DetailView):
    model = Car

На основе следующей надуманной модели

# Cars
class Car(models.Model):
    name = models.CharField(max_length=32)

# Manufacturers
class Manufacturer(models.Model):
    name = models.CharField(max_length=32)

# Parts
class Part(models.Model):
    name = models.CharField(max_length=32)
    car = models.ForeignKey(Car)
    manufacturer = models.ForeignKey(Manufacturer)

Шаблон HTML тогда

{{ car.name }}
<ul>
{% for part in car.part_set.all %}
    <li>{{ part.name }} - {{ part.manufacturer.name }} </li>
{% endfor %}
</ul>

Это прекрасно работает, чтобы получить автомобиль, части, которые его составляют, и производителей этих частей. Однако для этого будут использоваться SQL-запросы 2 + number_of_parts. Легко исправляется так:

{{ car.name }}
<ul>
{% for part in car.part_set.select_related.all %}
    <li>{{ part.name }} - {{ part.manufacturer.name }} </li>
{% endfor %}
</ul>

Теперь запускается оптимум из 2 запросов. Тем не мение,select_related соединяет части с каждым имеющимся у него внешним ключом. Есть ли способ ограничить это только желаемыми связанными таблицами. В Python это просто:

Part.objects.select_related('manufacturer').filter(car=car)

Можно ли это сделать в шаблоне?

Примечание: я знаю, что могу сделать это в представлении очень легко, возвращая контекст для 'car' и один для 'parts' с помощьюselect_related('manufacturer') на фильтре, но это немного больше кода по сравнению с подклассом DetailView, который я использовал выше. Что-то вроде этого:

class DemoCarViewPreload(TemplateView):
    template_name = 'demo/car_detail_preload.html'
    def get_context_data(self, **kwargs):
        context = super(DemoCarViewPreload, self).get_context_data(**kwargs)
        car = Car.objects.get(pk=kwargs.get('pk'))
        context['car'] = car
        context['parts'] = Part.objects.select_related('manufacturer').filter(car=car)
        return context

Однако для этого требуется, чтобы шаблон был более конкретным для этого представления, поскольку теперь ему нужно будет использовать контекст «частей», а неcar.part_set.all, Кроме того, это просто больше работы, чтобы сделать это представление в первую очередь.

Ответы на вопрос(1)

Ваш ответ на вопрос