2012-01-11 16 views
6

Obtengo un conjunto de consulta para un determinado modelo y me gustaría obtener su complemento, es decir, todas las instancias de ese modelo que son no en el conjunto de preguntas antes mencionado.Django: Complemento del conjunto de consulta

¿Cómo puedo hacer eso?

+0

Sería de gran ayuda para que el Django queryset encadena desea que el complemento de, con el fin de darle la forma más precisa para conseguir ese complemento. –

+0

Quiero algo que funcione para cualquier conjunto de consulta. –

Respuesta

10

solución a corto

qs = Model.objects.filter(...) # qs with objects to exclude 
result = Model.objects.exclude(pk__in=qs.values_list('pk', flat=True)) 

Más solución SECO

Sin embargo, si desea utilizar la lógica muchas veces, sugeriría a encapsular en un método. Aquí está un ejemplo que personnaly utilizado en un conjunto de consultas personalizado:

class QuerysetUtils: 
    def get_queryset_complement(self, method): 
     return self.exclude(pk__in=method().values_list('pk', flat=True)) 


class ExpirableQueryset(QuerysetUtils, models.query.QuerySet): 
    def expired(self): 
     return self.filter(expiration__lte=timezone.now()) 

    def unexpired(self): 
     return self.get_queryset_complement(self.expired) 
+2

nota que este es ejecutado como una sub consulta, es decir, la lista de todos los identificadores no se genera a excluir (que de otro modo sería un rendimiento potencial de éxito) – second

+2

¿Es esta la solución más sucinta? –

+0

Tal vez haya uno mejor para su caso de uso, pero entonces sería útil, como dijo @ Chris Pratt, que nos muestran algo de código .... –

Cuestiones relacionadas