taggit example python django django-models metaprogramming

python - example - Modificar queryset predeterminado en django



django taggit example (2)

Puede escribir un administrador de consultas 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.

He agregado un campo ''cancelado'' a mi modelo, ¿hay alguna manera de modificar la consulta predeterminada del modelo a algo como cancelado = falso? sin tener que modificar todas mis consultas de filtro / exclusión?


Puede hacer esto con un administrador de modelo personalizado y anular la función get_queryset para filtrar siempre cancelled = False.

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()

Luego, al llamar a MyModel.objects.all() , siempre excluirá los 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/

EDITAR: Quizás un mejor enfoque con un administrador personalizado sería adjuntarlo a otra propiedad, que no sean objetos, tales como:

class MyModel(models.Model): # Blah blah active = CustomManager()

Y en sus vistas sus consultas se verían como MyModel.active.all() .

EDIT2: Método actualizado de ortografía de get_query_set a get_queryset para versiones modernas de django.