带值的get_object_or_404

时间:2014-11-30 16:32:08

标签: python django

views.py:

def car(request, car_id):
    car = get_object_or_404(Car, pk=car_id, active=1)
    return render(request, 'car.html', {'car': car,}
    )
car.html

中的

...
{{ car.mark }}, {{ car.options.year }}, etc.
...

所以,我对我的数据库有很多请求。在另一个视图中,我使用

all_cars = Cars.objects.all().filter(active=1).values(...)

在这个变种中,我只有2个请求db。

是的,我知道,我可以在汽车的视野中使用:

car = Car.objects.filter(id=car_id, active=1).values(...)[0]

是否有其他变体对get_object_or_404做了同样的事情,没有对db做很多请求?

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以将查询集作为第一个参数传递,而不是模型类。在这里,您可以使用select_related(和prefetch_related,但似乎您需要第一个)来减少数据库查询:

def car(request, car_id):
    cars = Car.objects.select_related('options')
    car = get_object_or_404(cars, pk=car_id, active=1)
    return render(request, 'car.html', {'car': car})