Django em

Resumo : neste tutorial, você aprenderá como usar o Django inpara verificar se um valor está em um conjunto de valores.

Introdução ao Django In

Usaremos o Employeemodelo no HRaplicativo para demonstração. O Employeemodelo é mapeado para a hr_employeetabela no banco de dados:

O operador SQL INretorna 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 INoperador para consultar as linhas da hr_employeetabela que department_idestá 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 inoperador:

>>> 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 inoperador em vez de uma lista de valores literais. Por exemplo, você encontra todos os funcionários nos departamentos Salese Marketingda 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 Salesou Marketing:

departments = Department.objects.filter(Q(name='Sales') | Q(name='Marketing'))Linguagem de código:  Python  ( python )

Segundo, passe department QuerySetpara o inoperador:

Employee.objects.filter(department__in=departments)Linguagem de código:  Python  ( python )

Nos bastidores, o Django executa uma consulta com o INoperador 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 NOToperador nega o INoperador. O NOT INoperador retorna verdadeiro se um valor não estiver em uma lista de valores:

field_name NOT IN (v1, v2, ...)

Para atuar NOT INno Django, você pode usar o Qobjeto 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 inpara 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))

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *