gpt4 book ai didi

python - 模板中的django select_related

转载 作者:太空狗 更新时间:2023-10-29 13:37:17 26 4
gpt4 key购买 nike

有时在 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”的上下文来非常轻松地在 View 中执行此操作,但它是与我上面使用的 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

但是,这需要模板更具体地针对此 View ,因为它现在需要使用“零件”上下文而不是 car.part_set.all。此外,首先制作此 View 只是更多的工作。

最佳答案

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 %}

关于python - 模板中的django select_related,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19523698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com