我有一个Car
模型和一个Passenger
模型,其中包含一个到Car
对象的ForeignKey。 Car
和Passenger
模型都有一个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。
答案 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是'香蕉'。所以返回三行。