2009-01-17 60 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') 

我想根據附加到該主題的最新消息對象獲取所有主題的順序。 我執行了這個查詢,但是這並沒有給出不同的查詢集。Queryset API distinct()不起作用?

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

此問題似乎不完整。 .distinct()的使用在哪裏,你認爲不起作用? (順便說一下,它確實有效)。 – 2009-01-18 22:55:48

回答

3

您會在documentation for .distinct()找到解釋。

我會通過在Topic模型中添加一個modified_date字段來取消規範化,並在消息保存或刪除時更新它。

7

你不需要不同的()在這裏,你需要的是aggregation。此查詢會做你想要什麼:

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

但如果這是生產代碼,你可能會想跟隨akaihola的意見,並直接反規範化「last_message_posted」到主題模型。

另外,Message.pub_date的默認值有錯誤。就像你現在所做的那樣,每當你第一次運行服務器並加載這段代碼時,datetime.now()將被執行一次,並且該值將被用作所有消息的pub_date。使用它代替傳遞可調用函數本身,以便在每個消息創建之前不會調用它:

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