首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关系ManyToMany存在子查询的Django中的复杂查询

关系ManyToMany存在子查询的Django中的复杂查询
EN

Stack Overflow用户
提问于 2015-11-09 17:17:30
回答 1查看 520关注 0票数 2

我正在用Django ORM编写一个查询,返回所有有技能集的人。

例如:拥有“语言==英语”和“角色==管理器”的所有人

SQL查询的示例如下:

代码语言:javascript
复制
select person.name 
  from person 
 where exists
        (select * 
          from skill 
         where skill.id = person.id
           and ((skill.type = 'language' and skill.value = 'English') and \ 
           (skill.type = 'role' and skill.value = 'Manager')))

我在Django中有一个结构类模型

代码语言:javascript
复制
class Person(models.Model):
    name = models.CharField(max_length=60)
    age = models.IntegerField()

class Skill(models.Model):
    type = models.CharField(max_length=20)
    value = models.CharField(max_length=30)
    persons = models.ManyToManyField(Person)

桌子上的记录

代码语言:javascript
复制
| name   | age |
|--------|-----|
| Arnold | 23  |
| Bull   | 24  | 
| John   | 25  |

桌上技能记录

代码语言:javascript
复制
| type     | value      | persons      |
|----------|------------|--------------|
| role     | Customer   | John, Bull   |
| role     | Manager    | John         |
| language | English    | Bull, Arnold |
| language | Portuguese | John, Bull   |

用例:

  • 在过滤角色上,客户和语言英语应该返回人牛。
  • 关于过滤角色,客户和语言葡萄牙语应该还人约翰和公牛。
  • 在过滤器角色管理器和语言英语不应返回任何结果。

是否有可能构建一个参与这些用例的查询?

EN

回答 1

Stack Overflow用户

发布于 2015-11-09 17:39:19

这应该是可行的:

代码语言:javascript
复制
Person.objects.filter(skill__type='role', skill__value='Customer')

您可以使用“__”符号访问相关对象属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33614531

复制
相关文章

相似问题

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