Solución:
Aunque no existe una forma oficial de hacer esto usando la notación de filtro, puede hacerlo fácilmente con la notación Q. Por ejemplo, si se asegura de que la función de tercera parte devuelva un objeto Q, no un QuerySet filtrado, puede hacer lo siguiente:
q = ThirdParty()
q = q | Q(valid=False)
Y las condiciones de SQL resultantes se unirán mediante el operador OR.
De los documentos:
Cada vez que refina un QuerySet, obtiene un QuerySet nuevo que no está vinculado de ninguna manera al QuerySet anterior. Cada refinamiento crea un QuerySet distinto y separado que se puede almacenar, usar y reutilizar.
Por tanto, dudo que haya una forma estándar de hacerlo. Podrías profundizar en el código, ver, qué filter()
hace y prueba un poco. Si eso no ayuda, mi suposición es que no tiene suerte y necesita reconstruir la consulta usted mismo.
Usa esta función
from django.db.models import Q
def remove_filter(lookup, queryset):
"""
Remove filter lookup in queryset
```
>>> queryset = User.objects.filter(email="[email protected]")
>>> queryset.count()
1
>>> remove_filter('email', queryset)
>>> queryset.count()
1000
```
"""
query = queryset.query
q = Q(**{lookup: None})
clause, _ = self._add_q(q, self.used_aliases)
def filter_lookups(child):
return child.lhs.target != clause.children[0].lhs.target
query.where.children = list(filter(filter_lookups, query.where.children))