我遇到了一个非常复杂的情况,因此我将提供一个简化版本,其中只包含与我的问题有关的信息:
我有一个People
表和一个Pets
表,它有一个名为Owner
的外键。一个人可以有多只宠物。我需要根据他们的宠物搜索人员表。用户指定的内容类似于“让所有没有任何名为Philip的宠物的人”。我正在做的是使用Q
对象进行过滤(只搜索没有该名称的宠物),然后循环以获取所有者。问题是,如果一个人有两只宠物,一只宠物被命名为菲利普,一只被命名为Yogifnia,那么主人仍然会出现。
最好的方法是什么?请注意,我需要一个可以轻松处理请求的解决方案,例如:
“让所有没有任何名叫菲利普的宠物的人都没有宠物狗狗。”
“让所有没有任何名为Philip OR的宠物的人都有一只名叫Jasper的宠物”
“让所有没有任何名叫菲利普的宠物的人都有一只名叫贾斯珀的宠物和一只名叫安德鲁的宠物”
我可以想到尴尬和低效的解决方案,但没有好的解决方案。
答案 0 :(得分:2)
尝试类似下一个:
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
)
)
);