首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查具有某个条目的外键的任何数据库条目是否具有特定值(Django)

检查具有某个条目的外键的任何数据库条目是否具有特定值(Django)
EN

Stack Overflow用户
提问于 2013-07-05 04:26:23
回答 1查看 56关注 0票数 0

我遇到了一个非常复杂的情况,所以我将给出一个简化的版本,其中只包含与我的问题相关的信息:

我有一个People表和一个Pets表,其中有一个名为Owner的外键。一个人可以养多个宠物。我需要根据他们的宠物搜索people表。用户指定类似于“获取所有没有宠物的人,取名为Philip”。我所做的是为过滤器使用一个Q对象(只是搜索没有该名字的宠物),然后遍历以获取主人。问题是,如果一个人有两只宠物,其中一只叫Philip,另一只叫Yogifnia,主人仍然会出现。

做这件事最好的方法是什么?请注意,我需要一个可以轻松处理以下请求的解决方案:

“给所有没有宠物的人取名叫菲利普,也不要宠物是贵宾犬。”

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2013-07-05 05:08:31

尝试下一步:

代码语言:javascript
复制
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' ) )

我们有没有养宠物“菲利普”的人,以及所有不是贵宾犬的宠物?

代码语言:javascript
复制
People.objects.filter( ~Q( pet__name = 'Philip' ) & ~Q( pet__type = 'poodle' ) ).exists()

对于*,我们将有一个类似于下面的查询:

代码语言:javascript
复制
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
        )
    )
);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17477695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档