通过Django QuerySet注释反向相关对象

时间:2019-04-23 11:37:04

标签: python sql django

情况

假设我具有以下模型:

class Garage(models.Model):
    width = ...
    height = ...

class Car(models.Model):
   garage = models.ForeignKey('Garage', on_delete=models.CASCADE)
   brand = ...

现在假设我必须找到所有带有width > 30且装有丰田汽车的车库。

然后我可以做一个简单的查询,如下所示:

results = Garage.objects.filter(width__gt=30, car__brand__icontains='Toyota')

问题

显示按车库分组的结果,我需要突出显示丰田汽车,如下所示:

GARAGE A
Volvo C30
Toyota Prius <---highlight this
Saab 93

GARAGE B
Toyota Yaris <---highlight this

GARAGE C
Fiat 500
Toyota C-HR <---highlight this

Django annotate()似乎不适用于相关字段。

任何智能解决方案?

我需要对车库模型(而不是汽车)进行查询。

编辑

为澄清我的问题,我在前端有一个搜索表。用户可以搜索车库属性和/或汽车属性。

在我的结果中,我想显示有用的车库(它们与查询匹配)。对于每个车库,我想在其中显示每辆汽车,但我需要突出显示 only 与查询匹配的汽车。

鉴于上面的示例(它是简化版本),在我的模板中,我有这样的内容:

{% for garage in results %}
     <div>
     Garage #{{garage.id}}: W {{garage.width}} x H {{garage.height}}
         <div>
         {% for car in results.car_set.all %}
             <span> {{car.brand}} {{car.model}} ... </span>
         {% endfor %}
         </div>
     </div>    

{% endfor %}

一切正常。但是我仍然需要突出显示感兴趣的汽车(例如,仅“丰田”汽车)。

希望我现在很清楚。谢谢大家。

1 个答案:

答案 0 :(得分:0)

Django注释确实支持反向关系扩展。您需要知道适合您的关系的相关名称,建议您使用related_name属性来定义反向调用的方式,如下所示:

class Car(models.Model):
   garage = models.ForeignKey('Garage', on_delete=models.CASCADE, related_name='cars')
   brand = ...

那么您的查询应该是

results = Garage.objects.filter(width__gt=30, cars__brand__icontains='Toyota')