Django中的复杂查询,其中子查询存在于多层次的ManyToMany中

时间:2015-11-09 17:17:31

标签: python django django-models

我正在Django ORM中编写一个返回所有具有技能组的人的查询。

例如:所有具有“language == English”和“role == Manager”

的人

SQL查询的示例如下:

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中有这个结构类模型

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)

表格上的记录

| name   | age |
|--------|-----|
| Arnold | 23  |
| Bull   | 24  | 
| John   | 25  |

桌上技巧记录

| type     | value      | persons      |
|----------|------------|--------------|
| role     | Customer   | John, Bull   |
| role     | Manager    | John         |
| language | English    | Bull, Arnold |
| language | Portuguese | John, Bull   |

用例:

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

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

1 个答案:

答案 0 :(得分:0)

这应该有效:

Person.objects.filter(skill__type='role', skill__value='Customer')

您可以使用“__”表示法访问相关对象属性。