Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

208
Views
Seleccione el último registro en el grupo con pedidos

Tengo problemas para escribir una consulta con Django ORM, quiero encontrar el registro más reciente en cada grupo. Estoy poniendo mensajes de chat en el modelo y quiero encontrar el chat más reciente de cada usuario y mostrar los chats más recientes de cada usuario y con el chat del usuario más reciente en la pantalla de inicio como en WhatsApp, Skype o aplicaciones similares. Actualmente, estoy usando la siguiente consulta,

 Chats.objects.all().order_by('user_id', '-date').distinct('user_id')

Al usar esto, puedo obtener el último chat de cada usuario, pero no puedo obtener la secuencia correcta. El resultado de la consulta está en el orden en que se crearon los usuarios en la base de datos, lo que entiendo es correcto, pero quiero mostrar al usuario que envió el último chat en la parte superior.

Mis Models.py

 class Chats(models.Model): user_id = models.ForeignKey(User, on_delete=models.CASCADE) chat = models.CharField(max_length=1023, null=True, blank=True) date = models.DateTimeField(auto_now_add=True)

Muchas gracias, por favor hágamelo saber si se requiere cualquier otra información.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Opción 1: Ordenar en la capa Django/Python

Primero se ordenan los ítems por user_id , y solo en caso de empate se toma el de fecha más reciente. Pero eso significa que eventualmente obtienes para cada usuario un objeto Chats , ordenado por user_id .

Creo que aquí su única opción es ordenarlo en el nivel de Django/Python, así que envuélvalo en una lista y ordene por date :

 from operator import attrgetter items = list(Chats.objects.order_by('user_id', '-date').distinct('user_id')) items .sort(key=attrgetter('date'), reverse=True) # work with items

y luego renderice los items en la plantilla.


Opción 2: anotar el modelo User en su lugar

Otra opción es anotar el modelo User y así trabajar con un QuerySet de objetos de User :

 from django.db.models import Max, OuterRef, Subquery User.objects.filter( chats__isnull=False ).annotate( last_date=Max('chats__date'), last_message= Subquery( Chat.objects.filter(user_id=OuterRef('pk')).order_by('-date').value('chat')[:1] ) ).order_by('-last_date')

Aquí los objetos User tendrán un atributo extra .last_date con la última fecha y hora del objeto y .last_message con ese mensaje.


Nota : normalmente es mejor hacer uso de la settings.AUTH_USER_MODEL [Django-doc] para referirse al modelo de usuario, que usar el modelo User [Django-doc] directamente. Para obtener más información, puede consultar la referencia a la sección Modelo de User de la documentación .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!