簡體   English   中英

模板中的Django select_related

[英]django select_related in template

有時在Django模板中使用select_related是有意義的。 例如,假設我有一個擴展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>

這非常適合獲得汽車,組成汽車的零件以及這些零件的制造商。 但是,這將使用2 + number_of_parts個SQL查詢來執行此操作。 像這樣輕松修復:

{{ 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)

可以在模板中完成嗎?

注意:我知道我可以通過在過濾器上通過select_related('manufacturer')返回一個'car'上下文和一個'parts'上下文來非常輕松地在視圖中執行此操作,但是與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

但是,這要求模板對該視圖更加特定,因為它現在需要使用'parts'上下文而不是car.part_set.all 此外,首先要制作此視圖只是要做更多的工作。

Car模型上的簡單方法怎么樣?

class Car(models.Model):
    ...
    def parts_with_manufacturers(self):
        return self.part_set.select_related('manufacturer')

然后

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM