Resumo : neste tutorial, você aprenderá como usar o Django in
para verificar se um valor está em um conjunto de valores.
Introdução ao Django In
Usaremos o Employee
modelo no HR
aplicativo para demonstração. O Employee
modelo é mapeado para a hr_employee
tabela no banco de dados:
O operador SQL IN
retorna verdadeiro se um valor estiver em um conjunto de valores:
field_name IN (v1, v2, ...)
Linguagem de código: Python ( python )
Por exemplo, você pode usar o IN
operador para consultar as linhas da hr_employee
tabela que department_id
está em uma lista como esta:
SELECT *
FROM hr_employee
WHERE department_id IN (1,2,3)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
No Django, você usa o in
operador:
>>> Employee.objects.filter(department_id__in=(1,2,3))
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name",
"hr_employee"."contact_id",
"hr_employee"."department_id"
FROM "hr_employee"
WHERE "hr_employee"."department_id" IN (1, 2, 3)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Normalmente, você usa uma subconsulta com o in
operador em vez de uma lista de valores literais. Por exemplo, você encontra todos os funcionários nos departamentos Sales
e Marketing
da seguinte forma:
>>> departments = Department.objects.filter(Q(name='Sales') | Q(name='Marketing'))
>>> Employee.objects.filter(department__in=departments)
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name",
"hr_employee"."contact_id",
"hr_employee"."department_id"
FROM "hr_employee"
WHERE "hr_employee"."department_id" IN (
SELECT U0."id"
FROM "hr_department" U0
WHERE (U0."name" = 'Sales' OR U0."name" = 'Marketing')
)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como funciona.
Primeiro, obtenha os departamentos com os nomes Sales
ou Marketing
:
departments = Department.objects.filter(Q(name='Sales') | Q(name='Marketing'))
Linguagem de código: Python ( python )
Segundo, passe department
QuerySet
para o in
operador:
Employee.objects.filter(department__in=departments)
Linguagem de código: Python ( python )
Nos bastidores, o Django executa uma consulta com o IN
operador que corresponde ao ID do departamento com uma lista de IDs de departamento de uma lista:
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name",
"hr_employee"."contact_id",
"hr_employee"."department_id"
FROM "hr_employee"
WHERE "hr_employee"."department_id" IN (
SELECT U0."id"
FROM "hr_department" U0
WHERE (U0."name" = 'Sales' OR U0."name" = 'Marketing')
)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
NÃO EM
O NOT
operador nega o IN
operador. O NOT IN
operador retorna verdadeiro se um valor não estiver em uma lista de valores:
field_name NOT IN (v1, v2, ...)
Para atuar NOT IN
no Django, você pode usar o Q
objeto e ~
o operador:
~Q(field_name__in=(v1,v2,..))
Linguagem de código: buffers de protocolo ( protobuf )
Por exemplo, o seguinte comando localiza funcionários cujo ID de departamento não é 1, 2 ou 3:
>>> Employee.objects.filter(~Q(department_id__in=(1,2,3)))
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name",
"hr_employee"."contact_id",
"hr_employee"."department_id"
FROM "hr_employee"
WHERE NOT ("hr_employee"."department_id" IN (1, 2, 3))
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Alternativamente, você pode usar o exclude()
método em vez do filter()
método:
>>> Employee.objects.exclude(department_id__in=(1,2,3))
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name",
"hr_employee"."contact_id",
"hr_employee"."department_id"
FROM "hr_employee"
WHERE NOT ("hr_employee"."department_id" IN (1, 2, 3))
Linguagem de código: JavaScript ( javascript )
Resumo
- Use o Django
in
para verificar se um valor está em uma lista de valores.
Django ORM | SQL |
---|---|
Entity.objects.filter(id__in=(v1,v2,v3) |
id IN (v1,v2,v3) |
Entity.objects.filter(~Q(id__in=(v1,v2,v3)) |
NOT (id IN (v1,v2,v3)) |
Entity.objects.exclude(id__in=(v1,v2,v3) |
NOT (id IN (v1,v2,v3)) |