Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

281
Views
Django: filtro en el campo del modelo relacionado que no es igual a un valor específico

Dados estos modelos:

 from django.db import models class Foo(models.Model): pass # table with only one column, ie a primary key 'id' of type integer class Bar(models.Model): value = models.TextField() foo = models.ForeignKey(Foo, on_delete=models.CASCADE, related_name='bars')

¿Cómo crear un filtro que devuelva todos los Foo relacionados con al menos una Bar con un value distinto de cero ?

Soy consciente de que es posible seleccionar primero las Bar distintas de cero y luego devolver las Foo relacionadas con ellas. Pero estoy buscando específicamente una solución que obtenga directamente los Foo s relevantes en un QuerySet. La razón es que podría aplicarse fácilmente a las relaciones anidadas en un nivel más profundo.


Qué no funciona

Es sencillo crear un QuerySet que devuelva todos los Foo relacionados con al menos una Bar con un value cero :

 Foo.objects.filter(bars__value="zero")

Sin embargo, debido a la falta del operador "no igual" en los métodos de filtro de Django, es imposible hacer algo como esto:

 Foo.objects.filter(bars__value__not_equal="zero") # Unsupported lookup 'not_equal' for TextField

Usando exclude :

 Foo.objects.exclude(bars__value="zero")

no produce la salida deseada porque excluye todos los Foo que se relacionan con al menos una Bar con un valor cero.

Por lo tanto, si un Foo está relacionado con dos Bar s, uno de los cuales tiene un value cero y el otro tiene un value distinto de cero, sería filtrado por esta exclude . Sin embargo, la intención es incluirlo porque está relacionado con al menos una Bar con un valor distinto de cero.

De manera similar, usando el objeto Q negado:

 Foo.objects.filter(~models.Q(bars__value="zero"))

tampoco produce la salida deseada porque solo incluiría todos los Foo s que no están relacionados con ningún Bar s con un valor cero.

Crearía el mismo QuerySet que el método de exclude mencionado anteriormente.


notas

El tipo del campo B.value se eligió intencionalmente como texto en los ejemplos para enfatizar que estoy buscando una solución genérica en la que el operador "distinto" no se pueda emular usando, por ejemplo, una combinación de "menor que" y "mayor". que" operadores.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Tampoco puedo pensar en una forma simple de lograr esto, pero usar una Subquery para excluir las Bar de valor cero podría funcionar:

 from django.db.models import Subquery qs = Foo.objects.filter( bars__pk__in=Subquery(Bar.objects.exclude(value="zero").values('pk')) )

Esto debería proporcionarle todas las instancias de Foo con una relación con un Bar con un valor distinto de cero.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!