2010-03-22 15 views

Respuesta

29

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.

+2

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

+1

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. –

+1

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

4

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.

+5

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

Cuestiones relacionadas