template - Anular queryset predeterminado en el administrador de Django
django-admin command (4)
¿Qué estaría tan mal con lo siguiente?
class Conversation(BaseModel):
...
deleted = models.BooleanField(default=False)
objects = models.Manager() # includes deleted conversations
nondeleted_conversations = NondeletedManager()
Entonces, en sus propias aplicaciones / proyectos, usa Conversation.nondeleted_conversations()
y deja que la aplicación de administración incorporada lo haga.
Uno de mis modelos tiene una bandera eliminada, que se usa para ocultar objetos de forma global:
class NondeletedManager(models.Manager):
"""Returns only objects which haven''t been deleted"""
def get_query_set(self):
return super(NondeletedManager, self).get_query_set().exclude(deleted=True)
class Conversation(BaseModel):
...
deleted = models.BooleanField(default=False)
objects = NondeletedManager()
all_conversations = models.Manager() # includes deleted conversations
¿Cómo puedo anular el queryset predeterminado utilizado por el módulo de administración de Django para incluir conversaciones eliminadas?
Konrad tiene razón, pero esto es más difícil que el ejemplo dado en la documentación.
Las conversaciones eliminadas no se pueden incluir en un conjunto de consulta que ya las excluye. Por lo tanto, no veo otra opción más que volver a implementar admin.ModelAdmin.queryset por completo.
class ConversationAdmin (admin.ModelAdmin):
def queryset (self, request):
qs = Conversation.all_conversations
ordering = self.get_ordering(request)
if ordering:
qs = qs.order_by(*ordering)
return qs
La solución aceptada funciona muy bien para mí, pero necesitaba un poco más de flexibilidad, así que terminé extendiendo la vista de lista de cambios para agregar un parámetro de conjunto de consulta personalizado. Ahora puedo configurar mi queryset / filter predeterminado como tal y aún puede modificarse usando un filtro diferente (get parameters):
def changelist_view(self, request, extra_context=None):
if len(request.GET) == 0 :
q = request.GET.copy()
q[''status__gt''] = 4
request.GET = q
request.META[''QUERY_STRING''] = request.GET.urlencode()
return super(WorksheetAdmin,self).changelist_view(request, extra_context=extra_context)
Puede override método get_queryset
en su clase de administrador modelo.
class MyModelAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(MyModelAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(author=request.user)
Tenga en cuenta que en Django <= 1.5 el método se llamó solo queryset
.