我遇到了一个非常复杂的情况,所以我将给出一个简化的版本,其中只包含与我的问题相关的信息:
我有一个People表和一个Pets表,其中有一个名为Owner的外键。一个人可以养多个宠物。我需要根据他们的宠物搜索people表。用户指定类似于“获取所有没有宠物的人,取名为Philip”。我所做的是为过滤器使用一个Q对象(只是搜索没有该名字的宠物),然后遍历以获取主人。问题是,如果一个人有两只宠物,其中一只叫Philip,另一只叫Yogifnia,主人仍然会出现。
做这件事最好的方法是什么?请注意,我需要一个可以轻松处理以下请求的解决方案:
“给所有没有宠物的人取名叫菲利普,也不要宠物是贵宾犬。”
“让所有没有养宠物的人叫菲利普,或者养宠物叫贾斯珀的人”
“让所有没有养宠物的人叫菲利普,或者养一只叫贾斯珀的宠物和一只叫安德鲁的宠物。”
我可以想到笨拙和低效的解决方案,但没有好的解决方案。
发布于 2013-07-05 05:08:31
尝试下一步:
People.objects.filter( ~Q( pet__name = 'Philip' ) & ~Q( pet__type = 'poodle' ) ) # *
People.objects.filter( ~Q( pet__name = 'Philip' ) | Q( pet__name = 'Jasper' ) )
People.objects.filter( ~Q( pet__name = 'Philip' ) | Q( pet__name = 'Jasper' ) | Q( pet__name = 'Andrew' ) )我们有没有养宠物“菲利普”的人,以及所有不是贵宾犬的宠物?
People.objects.filter( ~Q( pet__name = 'Philip' ) & ~Q( pet__type = 'poodle' ) ).exists()对于*,我们将有一个类似于下面的查询:
SELECT people.id, people.name FROM people
WHERE
(
NOT
(
(
people.id IN
(
SELECT U1.owner_id FROM pet U1
WHERE
(
U1.name = E\'Philip\' AND U1.owner_id IS NOT NULL
)
)
AND people.id IS NOT NULL
)
)
AND NOT
(
(
people.id IN
(
SELECT U1.owner_id FROM pet U1 WHERE
(
U1.type = E\'poodle\' AND U1.owner_id IS NOT NULL
)
)
AND people.id IS NOT NULL
)
)
);https://stackoverflow.com/questions/17477695
复制相似问题