python - ejemplos - Queryset API distinct() no funciona?
django (2)
Encontrará la explicación en la documentación para .distinct()
.
Desnormalizaría agregando un campo modified_date
al modelo Topic
y actualizándolo siempre que se guarde o elimine un mensaje.
class Message(models.Model):
subject = models.CharField(max_length=100)
pub_date = models.DateTimeField(default=datetime.now())
class Topic(models.Model):
title = models.CharField(max_length=100)
message = models.ManyToManyField(Message, verbose_name=''Discussion'')
Quiero ordenar todos los temas de acuerdo con el último objeto de mensaje adjunto a ese tema. Ejecuté esta consulta, pero esto no da el queryset distinto.
>> Topic.objects.order_by(''-message__pub_date'').distinct()
No necesita distinct () aquí, lo que necesita es agregación . Esta consulta hará lo que quieras:
from django.db.models import Max
Topic.objects.annotate(Max(''message__pub_date'')).order_by(''-message__pub_date__max'')
Aunque si se trata de código de producción, es probable que desee seguir el consejo de akaihola y desnormalizar "last_message_posted" en el modelo Topic directamente.
Además, hay un error en su valor predeterminado para Message.pub_date. Como lo tiene ahora, cada vez que ejecuta el servidor y se carga este código, datetime.now () se ejecutará una vez y ese valor se usará como pub_date para todos los mensajes. Use esto en su lugar para pasar el callable en sí mismo para que no se invoque hasta que se haya creado cada mensaje:
pub_date = models.DateTimeField(default=datetime.now)