El libro de Django 1.0

9.4. Mostrar subconjuntos de objetos

Ahora echemos un vistazo más de cerca a esta clave queryset que hemos venido usando hasta aquí. La mayoría de las vistas genéricas usan uno de estos argumentos queryset — es la manera en que la vista conoce qué conjunto de objetos mostrar (mira "Seleccionando objetos" en el Capítulo 5 para una introducción a los QuerySets, y mira el Apéndice C para los detalles completos).

Para tomar un ejemplo simple, tal vez querríamos ordenar una lista de books por fecha de publicación, con el más reciente primero.

book_info = {
    "queryset" : Book.objects.all().order_by("-publication_date"),
}

urlpatterns = patterns('',
    (r'^publishers/$', list_detail.object_list, publisher_info),
    (r'^books/$', list_detail.object_list, book_info),
)

Aunque se trata de un ejemplo muy sencillo, ilustra bien la idea. Obviamente en una aplicación real tendrás que hacer algo más que reordenar objetos. Si quieres presentar una lista de libros de un publisher particular, puedes usar la misma técnica:

apress_books = {
    "queryset": Book.objects.filter(publisher__name="Apress Publishing"),
    "template_name" : "books/apress_list.html"
}

urlpatterns = patterns('',
    (r'^publishers/$', list_detail.object_list, publisher_info),
    (r'^books/apress/$', list_detail.object_list, apress_books),
)

Nota que además de un queryset filtrado, también estamos usando un nombre de plantilla personalizado. Si no lo hiciéramos, la vista genérica usaría la misma plantilla que la lista de objetos "genérica", que puede no ser lo que queremos.

También nota que ésta no es una forma muy elegante de hacer publisher-specific books. Si queremos agregar otra página publisher, necesitamos otro puñado de líneas en la URLconf, y más de unos pocos publishers no será razonable. Enfrentaremos este problema en la siguiente sección.

Si obtienes un error 404 cuando solicitas /books/apress/, para estar seguro, verifica que en realidad tienes un Publisher con el nombre Apress Publishing. Las vistas genéricas tienen un parámetro allow_empty para este caso. Mira el Apéndice D para mayores detalles.