【问题标题】:Annotate reverse related object via Django QuerySet通过 Django QuerySet 注释反向相关对象
【发布时间】:2019-04-23 11:37:04
【问题描述】:

情况

假设我有以下模型:

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

任何聪明的解决方案?

注意我需要查询 Garage 模型(不是 Car)。

编辑

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

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

鉴于上面的例子(这是一个简化版本),在我的模板中我有这样的东西:

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

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

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

【问题讨论】:

  • 查询 icontains='Toyota' 是否也返回了 Volvo
  • “突出显示”是什么意思?你到底想做什么?
  • @Endre Both:我需要在其他车辆中识别出感兴趣的汽车!
  • 也许你可以发布你的模板或一些伪代码来展示你想要做什么。您是否需要一个查询来选择具有所有相关丰田车型(但没有其他车型)的所有车库?或者还有什么?
  • @JPG 是的,查询results 正确返回了车库对象,我可以从中获取其中的所有汽车(所以,沃尔沃、丰田、菲亚特等等……)像@987654329 一样迭代@

标签: python sql django


【解决方案1】:

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

【讨论】:

  • 我使用了默认的相关名称。好的。但是你的帖子没有回答这个问题。
  • 好的,你的问题到底是什么?您想在车库中的所有汽车中找出名称为“Toyota”的汽车吗?你在哪里需要这个?在前端?为什么你说你“必须对车库模型进行查询”?请澄清这些要点,以便给出正确的答案
猜你喜欢
  • 2019-06-19
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 2010-11-03
  • 2011-04-18
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多