Queryset API distinct()不起作用?

时间:2009-01-17 15:49:11

标签: python django

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') 

我想根据附加到该主题的最新消息对象来获取所有主题的顺序。 我执行了这个查询但是没有给出不同的查询集。

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

2 个答案:

答案 0 :(得分:7)

这里你不需要distinct(),你需要的是aggregation。此查询将执行您想要的操作:

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

虽然这是生产代码,但您可能希望遵循akaihola的建议并直接将“last_message_posted”非规范化到Topic模型上。

此外,Message.pub_date的默认值存在错误。正如您现在所拥有的那样,无论何时第一次运行服务器并加载此代码,datetime.now()都将执行一次,该值将用作所有Messages的pub_date。使用它来代替传递callable本身,以便在创建每个Message之前不调用它:

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

答案 1 :(得分:3)

您可以在documentation for .distinct()中找到解释。

我会通过向modified_date模型添加Topic字段并在保存或删除邮件时更新它来取消规范化。