Considere dos objetos QuerySet de la misma clase. ¿Existe una manera simple de unificarlos en un único QuerySet calculando la unión? Además, ¿hay una manera simple de restarlos? ¿Eliminando todos los elementos que aparecen en ambos conjuntos de uno de los conjuntos?forma simple para la unión y sustracción de QuerySet en django?
Respuesta
Creo que para operaciones como esta debe evaluarlas. ¡Así que puede llamar al list()
y trabajar en ellos con las operaciones comunes de la lista de Python!
Puede usar el Q
object.
La sintaxis podría ser algo como esto:
added_query_set = YourModel.objects.\
filter(Q(id__in=old_query_set_1)|Q(id__in=old_query_set_2))
Es probable que pueda optimización en función de sus necesidades reales y obtener la cantidad de db golpea hacia abajo (en este momento es 3), pero esto debe empezar.
+1 por hacerlo bien con querysets, pero supongo que incluso está llegando al db una vez más que agregar listas. ¡Supongo que el método que prefieres depende de si quieres un qs no evaluado o éxitos de DB menores! –
Teniendo en cuenta los parámetros reales de los dos 'QuerySet's originales, debería poder incluir esos parámetros en los objetos' Q' y bajar a un db presionar – Zach
Volviendo a django's documentation, se puede:
new_query_set = query_set_1 | query_set_2
Esto funciona como un OR lógico que en realidad es además sin duplicados. ¡Esto responde al aspecto de la suma y AFAIK no golpea el DB en absoluto!
new_query_set = query_set_1 & query_set_2
Esto funciona como un AND lógico.
Aún falta cómo restar QuerySets. Es difícil para mí creer que esto no ha sido tratado con elegancia por la comunidad ...
Reste un QuerySet de otro QuerySet utilizando el mismo modelo.
Esto funciona - pero es probable que poco a poco
queryset_with_hello = Blog.objects.filter(name__icontains='hello')
queryset_without_hello = Blog.objects.exclude(pk__in=queryset_with_hello)
Lea las consideraciones de rendimiento en la documentación de Django:
https://docs.djangoproject.com/en/dev/ref/models/querysets/#in
Esto solo funciona al construir QuerySets, la pregunta es acerca de ** ** QuerySets existentes. ¿Cómo se podría hacer qs1- qs2 cuando ya existen como conjuntos de consulta? – Curtwagner1984
La modificación de un conjunto de consulta existente es una noción que no tiene mucho sentido en django. Haga esto: 'q = Blog.objects.filter (pk__in = q1) .exclude (pk__in = q2)' – DylanYoung
Desde Django 1.11, QuerySets tienen union()
, intersection()
and difference()
methods.
También es posible use |
and &
operators con QuerySets (no pude encontrar una referencia a esto en e documentos, así que supongo que union()
y intersection()
es la forma preferida de combinar dos conjuntos de consulta.
qs3 = qs1.union(qs2) # or qs3 = qs1 | qs2
qs3 = qs1.intersection(qs2) # or qs3 = qs1 & qs2
qs3 = qs1.difference(qs2) # the^operator is not implemented.
también puede utilizar Q()
objects que al igual que QuerySets implementar |
y &
, y, además, la inversión del operador ~
- 1. Django: filtro para get_foo_display en un Queryset
- 2. Orden Django QuerySet
- 3. Filtros de Django Custom Queryset
- 4. Unión externa completa en django
- 5. Filter Queryset en Django inlineformset_factory
- 6. Modificar queryset predeterminado en django
- 7. Django queryset de actualización con la anotación
- 8. Operador de suscripciones y sustracción
- 9. Objetos gráficos SVG/vector operaciones booleanas (unión, intersección, sustracción)
- 10. Django queryset - la búsqueda de nombre y apellido
- 11. Django: inspeccionar queryset para obtener filtros aplicados
- 12. Cómo usar django annotate() y aggregate() para agrupar un queryset?
- 13. queryset Django para muchos-a-muchos coloca
- 14. En forma Django, SelectField personalizado y SelectMultipleField
- 15. Django - Lista única de QuerySet
- 16. Comprobación de queryset vacío en Django
- 17. Django QuerySet filter + order_by + limit
- 18. impresión Django QuerySet SQL con ""
- 19. Cambiar un objeto QuerySet sobre la marcha en Django
- 20. Django filter on queryset intersection?
- 21. cómo subconsultar en queryset en django?
- 22. ¿Qué es un django QuerySet?
- 23. búsqueda rápida para el último elemento en un Django QuerySet?
- 24. Anulación queryset defecto en Django administrador
- 25. Django Queryset en todos los modelos?
- 26. En Django QuerySet, ¿cómo hago la negación en el filtro?
- 27. Django queryset a dict para su uso en JSON
- 28. Búsqueda simple en Django
- 29. cómo renderizar un Queryset en una plantilla de tabla-django
- 30. Django queryset con la filtración en el reverso clave externa
¿Podemos obtener algunos ejemplos de cómo se generan las dos QuerySets inicial y cómo se usan? Con más información, ¿puede simplemente optimizar su QuerySet original en lugar de tener que sumar/restar? –
qs1 = MyObj1.objects.filter (some_field__gte = value) - qs2 por otro lado es en realidad una relación M2M entre una cierta instancia MyObj2 y las instancias MyObj1 Pensé que preguntaré sobre QuerySets, ya que creo que la respuesta sería aplicable a myobj2_instance.myobj1 también. – Jonathan