通过Django查询注释反向相关对象

2024-05-13 08:07:22 发布

您现在位置:Python中文网/ 问答频道 /正文

形势

假设我有以下模型:

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()似乎没有处理相关字段。你知道吗

有什么聪明的解决办法吗?你知道吗

注意,我需要查询车库模型(而不是汽车)。

编辑

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

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

鉴于上述示例(简化版),在我的模板中,我有如下内容:

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

一切正常。但我仍然需要强调感兴趣的汽车(例如,仅限“丰田”汽车)。你知道吗

希望我现在明白了。谢谢大家。你知道吗


Tags: 模型divmodelsthiswidthcar汽车results
1条回答
网友
1楼 · 发布于 2024-05-13 08:07:22

Django annotate不支持反向关系扩展。您需要知道关系的正确相关名称,我建议您使用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')

相关问题 更多 >