He agregado un campo 'cancelado' a mi modelo, ¿hay alguna manera de modificar la consulta predeterminada del modelo a algo como cancelled = False? sin tener que modificar todas mis consultas de filtro/exclusión?Modificar queryset predeterminado en django
Respuesta
Puede hacerlo con un administrador de modelos personalizado y anular la función get_queryset
para filtrar siempre canceló = Falso.
class CustomManager(models.Manager):
def get_queryset(self):
return super(CustomManager, self).get_queryset().filter(canceled=False)
class MyModel(models.Model):
# Blah blah
objects = CustomManager()
A continuación, cuando se llama a MyModel.objects.all()
siempre va a excluir objetos cancelados. Aquí hay una publicación de blog que encontré útil sobre el tema. http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/
EDIT: Tal vez un mejor enfoque con un gestor de encargo sería para adjuntarlo a otra propiedad, aparte de objetos, tales como:
class MyModel(models.Model):
# Blah blah
active = CustomManager()
Y en sus puntos de vista a sus consultas se vería como MyModel.active.all()
.
EDIT2: Método actualizado de ortografía desde get_query_set
hasta get_queryset
para las versiones modernas de django.
Puede escribir query manager personalizado, pero no creo que este sea el camino correcto. Esto crearía una condición implícita y oculta para un filtro, lo que haría que el código sea ilegible. Recuerde Zen of Python: Explicit is better than implicit
. Detecta lugares, donde debes agregar cancelled = False y simplemente agrega esto, esa es la forma en que debes hacer esto.
Estoy totalmente en desacuerdo. ¿Cuál sería, entonces, el objetivo de tener administradores personalizados? ¿Qué tiene de implícito 'not_cancelled = CustomManager()' y luego usa MyModel.not_cancelled.all()? – jonwd7
- 1. Filter Queryset en Django inlineformset_factory
- 2. Orden Django QuerySet
- 3. Django filter on queryset intersection?
- 4. Django QuerySet filter + order_by + limit
- 5. impresión Django QuerySet SQL con ""
- 6. Django - Lista única de QuerySet
- 7. Filtros de Django Custom Queryset
- 8. cómo subconsultar en queryset en django?
- 9. ¿Qué es un django QuerySet?
- 10. Django: filtro para get_foo_display en un Queryset
- 11. Django Queryset en todos los modelos?
- 12. Comprobación de queryset vacío en Django
- 13. Anulación queryset defecto en Django administrador
- 14. Modificar el valor hash predeterminado
- 15. Pedido personalizado Django QuerySet por ID
- 16. Django queryset filter for blank FileField?
- 17. Django queryset de actualización con la anotación
- 18. Obtener el SQL de un Django QuerySet
- 19. Django grouping queryset por primera letra?
- 20. django - pidiendo queryset por un campo calculado
- 21. Django: inspeccionar queryset para obtener filtros aplicados
- 22. Problema Django QuerySet .defer() - ¿error o característica?
- 23. queryset Django para muchos-a-muchos coloca
- 24. Llamar a Django guardar en un objeto QuerySet - El objeto 'QuerySet' no tiene ningún atributo 'guardar'
- 25. Django queryset - la búsqueda de nombre y apellido
- 26. Cómo filtrar queryset en changelist_view en django admin?
- 27. En Django QuerySet, ¿cómo hago la negación en el filtro?
- 28. Limitar la memoria Usar en un * Large * Django QuerySet
- 29. Cambiar un objeto QuerySet sobre la marcha en Django
- 30. ¿Cómo obtener la siguiente fila en un queryset django?
tiene que ser MUY MUY cuidadoso con la anulación de administrador predeterminado así como así. En este caso particular, una vez que se cancela el artículo, nunca lo encontrará con filter()/get(). –
De acuerdo. Por lo general, completaría este enfoque con la anulación de get() para no utilizar este filtro si se proporciona el pk. Probablemente también desee cambiar el queryset de administrador para devolver todo, incluso cancelado. Pero si rara vez quiere elementos cancelados en sus consultas, este puede ser un enfoque razonable. –
Hola, ¿hay alguna manera de modificar el comportamiento de get_query_set para usar parámetros adicionales, es decir, pasar de algún lado, o usar variables globales como la información de usuario de inicio de sesión actual? ¡Gracias! – ultrajohn