2015-11-09 2 views
1

Я пишу запрос в Django ORM, который возвращает всех людей, у которых есть набор навыков.Сложный запрос в Django, где существует подзапрос с рационализацией ManyToMany

Например: все люди с «языка == английский язык» и «роль == 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 | 

отчеты по таблице Skill

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

Прецеденты:

  • На фильтровальной роли заказчика и язык английский язык должен вернуть человека Bull.
  • О роли фильтра Клиент и язык Португальский должен вернуть людей Джона и Быка.
  • О роли фильтра Менеджер и язык Английский язык не должен возвращать никаких результатов.

Возможно ли построить запрос, который будет использоваться в этих случаях использования?

ответ

0

Это должно работать:

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

Вы можете получить доступ к связанным объектам атрибуты с '__' нотации.

+0

Спасибо, я буду связывать этот код, например: 'Person.objects.filter (skill__type = 'role', skill__value = 'Customer'). Filter (skill__type = 'idiom', skill__value = 'Portuguese'). Filter (skill__type = '...', skill__value = '...') ' –

+0

Я уверен, что вы можете, это объект запроса. – Gocht

Смежные вопросы