Estoy aprendiendo Django y todavía soy principiante. Para practicar, estoy tratando de hacer un sitio web de redes sociales de demostración. En mi proyecto, los usuarios pueden crear grupos, luego pueden publicar y comentar allí. En la página de inicio, estoy tratando de agregar una sección como 'actividades recientes' donde un usuario puede ver actividades recientes en ese sitio web como "John creó un grupo 'Javascript', Tim publicó un comentario en 'Python', Sarah publicó en ' CSS'" Ahora he hecho algunas consultas como: groups = Group.objects.all().order_by('-created')[0:5] posts = Post.objects.all().order_by('-created')[0:5] comments = Comment.objects.all().order_by('-created')[0:5]
Quiero mezclarlos todos en un solo conjunto de consultas. Luego ordénelos todos por el momento en que fueron creados. Sé que es una pregunta tonta y he estado atrapado aquí desde la mañana. ¿Me pueden ayudar y mostrarme el proceso por favor?
Puede encadenarlos y ordenarlos por el campo created con:
from operator import attrgetter groups = Group.objects.order_by('-created')[:5] posts = Post.objects.order_by('-created')[:5] comments = Comment.objects.order_by('-created')[:5] all_items = sorted( [*groups, *posts, *comments] , key= attrgetter('created') , reversed=True ) Ahora all_items es una lista heterogénea con diferentes tipos de objetos. Esto hará que el proceso de renderizado sea un poco más complicado, ya que un comment probablemente tenga campos diferentes a los de una Post por ejemplo.
También puede usar la función de chain del módulo itertools para combinar los conjuntos de consultas y luego ordenarlos en orden inverso usando el campo created como clave.
from itertools import chain groups = Group.objects.all()[0:5] posts = Post.objects.all()[0:5] comments = Comment.objects.all()[0:5] queryset = sorted( chain(groups, posts, comments), key=lambda instance: instance.created, reverse=True )