Saltar al contenido

Django: eliminar una condición de filtro de un conjunto de consultas

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))
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *