0

我遇到了一个非常复杂的情况,因此我将提供一个简化版本,其中仅包含与我的问题有关的信息:

我有一个People表和一个Pets表,其中有一个名为Owner. 一个人可以养多只宠物。我需要根据他们的宠物搜索人员表。用户指定诸如“获取所有没有任何名为 Philip 的宠物的人”之类的内容。我正在做的是使用一个Q对象作为过滤器(只搜索没有该名称的宠物),然后循环获取所有者。问题是,如果一个人有两只宠物,一只叫菲利普,一只叫约吉尼亚,主人仍然会出现。

最好的方法是什么。请注意,我需要一个可以轻松处理请求的解决方案,例如:

“让所有没有任何宠物叫菲利普并且没有任何宠物贵宾犬的人。”

“让所有没有宠物叫菲利普或有宠物叫贾斯珀的人”

“让所有没有宠物叫菲利普的人,或者有一只叫贾斯珀的宠物和一只叫安德鲁的宠物”

我能想到笨拙和低效的解决方案,但没有好的解决方案。

4

1 回答 1

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
        )
    )
);
于 2013-07-04T21:08:31.023 回答