0

我有一个Car模型和一个Passenger带有外键的模型到一个Car对象。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' 并且其中有三个乘客叫任何东西(匹配或不匹配 'banana')时,它会返回 match 的三倍Car

问题是:

  • 为什么?

  • 怎样才能只回一次车?我认为这.distinct()会奏效,但也许有更好的方法。

我正在使用 Django 1.5。

4

1 回答 1

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 为“香蕉”。所以返回三行。

于 2013-08-27T18:53:08.420 回答