Читать книгу Django 2 - Antonio Melé - Страница 54

Recuperar artículos por similitud

Оглавление

Una vez implementado el sistema de etiquetado en el blog, puede utilizarlo para hacer cosas interesantes con él. A través de las etiquetas, puede clasificar de forma muy específica el contenido del blog. Artículos de temas relacionados tendrán etiquetas comunes. Va a construir una funcionalidad para mostrar artículos similares según la cantidad de etiquetas en común. De esta forma, cuando un usuario lea un artículo, puede sugerirle leer otros con contenido relacionado.

Para recuperar los artículos similares a otro artículo, es necesario realizar los siguientes pasos:

1. Recuperar todas las etiquetas del artículo actual.

2. Recuperar todos los artículos que contengan algunas de las etiquetas previamente recuperadas.

3. Excluir el artículo actual de la lista anterior para evitar recomendar el mismo artículo.

4. Ordenar los resultados por número de etiquetas en común con el artículo actual.

5. En caso de que uno o más artículos contengan el mismo número de etiquetas, se recomienda el más reciente.

6. Limitar la consulta al número de artículos que quiere recomendar.

Estos pasos se trasladan a consultas complejas que incluirá en la vista post_detail. Va a editar el fichero views.py y añadir la siguiente línea de importación al comienzo del fichero:


Esta es la función de agregación Count del ORM de Django. Esta función permite realizar contabilizaciones agregadas de etiquetas. El módulo django.db.models incluye las siguientes funciones de agregación:

• Avg: The value average

• Max: The maximum value

• Min: The minimum value

• Count: The objects count

Para profundizar sobre la agregación visita se recomienda visitar https://docs.djangoproject.com/en/2.0/topics/db/aggregation/.

Añadirá las siguientes líneas dentro de la vista post_detail antes de la función render(), con el mismo nivel de indentación:


El código anterior funciona del siguiente modo:

1. Se recupera una lista Python de identificadores de las etiquetas del artículo actual. El QuerySet values_list() devuelve tuplas con los valores de los campos especificados. Al pasar el parámetro flat=True, aplana la estructura, resultando: [1, 2, 3, ...].

2. Se recuperan todos los artículos que contengan cualquiera de las etiquetas, excluyendo el artículo actual.

3. Utilizará la agregación Count para generar un campo calculado (same_tags) que contiene el número de etiquetas compartidas de cada artículo con el actual.

4. Se ordenan los resultados por número de etiquetas compartidas (orden descendente) y por el campo publish, para mostrar primero los artículos más recientes en caso de coincidir en número de etiquetas en común. Se limitará a recuperar solo los 4 primeros artículos.

Añadirá el objeto similar_posts al contexto del diccionario de la función render() del siguiente modo:


Va ahora a editar la plantilla blog/post/detail.html y añadir el siguiente código antes de los comentarios del artículo:


Ahora nuestra página de detalle de artículo debería ser semejante a:


Ahora ya puede recomendar artículos a los usuarios. django-taggit también tiene un gestor, similar_objects(), que puede utilizar para recuperar objetos similares que contengan etiquetas en común. Para obtener más información sobre cómo funciona el gestor visite https://djangotaggit.readthedocs.io/en/latest/api.html.

Como último detalle, también puede añadir la lista de etiquetas de la vista de detalle a la plantilla blog/post/list.html.

Django 2

Подняться наверх