Q查询中的重复结果涉及与模型的多对一关系

时间:2013-08-27 18:39:44

标签: django django-1.5 django-q

我有一个Car模型和一个Passenger模型,其中包含一个到Car对象的ForeignKey。 CarPassenger模型都有一个name字段。

我想在汽车或任何乘客名字中获得所有包含'香蕉'的汽车,所以我试过:

from django.db.models import Q
...
name = 'banana'
cars = Car.objects.filter(Q(name__icontains=name) | Q(passenger__name__icontains=name))

奇怪的是,当我有一个Car名为'banana'并且其中有三名乘客呼叫任何东西(匹配或不匹配'香蕉')时,它会返回匹配Car的三倍。

问题是:

  • 为什么?

  • 如何只返回一次车?我认为.distinct()可行,但也许有更好的方法。

我正在使用Django 1.5。

1 个答案:

答案 0 :(得分:2)

其他人已经回答如何来获得你想要的东西,但你也问为什么,所以这里有:

您的查询将如下所示:

SELECT * FROM cars c
LEFT JOIN passengers p ON p.car_id = c.id
WHERE c.name LIKE '%banana%' OR p.name LIKE '%banana%' 

基本上,你是把汽车加到乘客身上,而且车里有三名乘客,其中car.name是'香蕉'。所以返回三行。

相关问题