2009-01-17 16 views
5
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. He ejecutado esta consulta, pero esto no da el queryset distinto.Queryset API distinct() no funciona?

>> Topic.objects.order_by('-message__pub_date').distinct() 
+0

Parece que esta pregunta está incompleta. ¿Dónde está el uso de .distinct() que crees que no funciona? (Por cierto, funciona). –

+0

¡Sí! ¡Correcto, lo extrañé! ¡Agregué ahora! – aatifh

Respuesta

3

Encontrará la explicación en el documentation for .distinct().

Desregularé agregando un campo modified_date al modelo Topic y actualizándolo cada vez que se guarde o elimine un mensaje.

7

No necesita distinct() aquí, lo que necesita es aggregation. Esta consulta va a hacer lo que quiere:

from django.db.models import Max 
Topic.objects.annotate(Max('message__pub_date')).order_by('-message__pub_date__max') 

Aunque si este es el código de producción, es probable que desee seguir el consejo de akaihola y desnormalizar "last_message_posted" sobre el modelo tema 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 utilizará como pub_date para todos los mensajes. Use esto en su lugar para pasar el callable por sí mismo para que no se invoque hasta que se haya creado cada mensaje:

pub_date = models.DateTimeField(default=datetime.now)